gpt4 book ai didi

ruby-on-rails - 为什么要执行这个回调?

转载 作者:行者123 更新时间:2023-12-04 05:52:19 28 4
gpt4 key购买 nike

我希望在更新记录之前运行验证。我知道before_update但我几乎从 api 文档中复制并粘贴了第一个代码片段。

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

如果我进入控制台并创建一个 entry 此回调正在 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

最佳答案

ActiveRecord::Callbacks 不支持 :on选项...

在 Rails 代码库中,唯一提到处理 :on 的地方选项位于 ActiveModel::Validations 的验证模块代码中.

如果您浏览 ActiveRecord::Callbacks代码,你会看到没有提到:on , ActiveRecord::Callbacks 模块也不包括任何将处理该选项的 ActiveModel::Validations 模块。 ActiveModel::Validations::Callbacks 有一个包含,但这只会提供 before_ 的定义。和 after_验证方法。但是,before_validationafter_validation回调将处理 :on选项如所见 here在他们的定义中。

关于ruby-on-rails - 为什么要执行这个回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935632/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com