【发布时间】:2012-03-30 00:47:56
【问题描述】:
我希望在更新记录之前运行验证。我知道before_update,但我几乎从api文档中复制并粘贴了第一个coden-p。
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
我的精简模型看起来像
class User < ActiveRecord::Base
attr_accessible :email
validates :email, :presence => true
before_save(:on => :update) do
puts "******** before_save on => :update ********"
# do something
end
end
如果我进入控制台并创建一个 new 条目,则此回调将在 SQL 插入调用中执行。
irb(main):001:0> User.new(:email => "test@test.com").save
(0.1ms) begin transaction
******** before_save on => :update ********
SQL (29.1ms) INSERT INTO "users" ("created_at", "email", "first_name", "last_name", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", Fri, 30 Mar 2012 00:26:33 UTC +00:00], ["email", "test@test.com"], ["first_name", nil], ["last_name", nil], ["updated_at", Fri, 30 Mar 2012 00:26:33 UTC +00:00]]
(433.1ms) commit transaction
=> true
irb(main):002:0>
我本来希望只在更新调用中看到这一点。任何人都可以对此有所了解吗?
[编辑]
我只是将回调更改为函数调用,结果没有变化。回调仍然在创建时执行。
class User < ActiveRecord::Base
attr_accessible :email
validates :email, :presence => true
before_save :my_before_update, :on => :update
private
def my_before_update
puts "******** before_save on => :update ********"
# do something
end
结束
输出是一样的。
Loading development environment (Rails 3.2.2)
irb(main):001:0> User.new(:email => "test@test.com").save
(0.1ms) begin transaction
******** before_save on => :update ********
SQL (28.2ms) INSERT INTO "users" ("created_at", "email", "first_name", "last_name", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", Fri, 30 Mar 2012 02:28:45 UTC +00:00], ["email", "test@test.com"], ["first_name", nil], ["last_name", nil], ["updated_at", Fri, 30 Mar 2012 02:28:45 UTC +00:00]]
(131.2ms) commit transaction
=> true
【问题讨论】:
-
在常规运行的应用程序中的行为相同。
-
也许我遗漏了一些东西,但我在文档中没有看到任何关于将
(:on => :update)传递给 before_save 的内容,为什么不使用before_update? -
正如我之前提到的,我知道有一个
before_update,但今天发生的事情是,当我完全需要它时我打开了文档,但它不起作用。:on在指南中用于验证 -> edgeguides.rubyonrails.org/… 回调紧随其后,文档再次提到:on模式。所以我拉了线...... -
看起来 :on 用于验证,即
validates :email, :presence => true, :on => :update只会在更新时验证电子邮件,我仍然没有看到任何说before_save应该采用 :on 选项。 -
update和save在验证和回调的上下文中并没有太大的不同......为什么要参数化save如果这是我唯一可以传递给before_save(:on =>的东西?
标签: ruby-on-rails ruby-on-rails-3 activerecord