【发布时间】:2011-03-27 04:26:47
【问题描述】:
post.rb 模型
after_update :assign_owner
def assign_owner
self.owner = "test"
end
上述方法在终端中有效,但不会改变 Rails 中 Post.new.owner 的值。我错过了什么?
【问题讨论】:
标签: ruby-on-rails ruby callback rails-activerecord
post.rb 模型
after_update :assign_owner
def assign_owner
self.owner = "test"
end
上述方法在终端中有效,但不会改变 Rails 中 Post.new.owner 的值。我错过了什么?
【问题讨论】:
标签: ruby-on-rails ruby callback rails-activerecord
这是更新后(需要保存对象)所以
post = Post.new.save
然后
post.owner # will be test
如果你想这样做,你可能想使用after_initialize
例如在 post.rb 中
class Post < ActiveRecord::Base
protected
def after_initialize
self.owner = "test
end
end
【讨论】:
after_initialize,所以在找到它们时,我也会添加一个额外的测试:self.owner = "test" if self.owner.nil? 或 if self.new_record? 否则你会始终更改所有者(例如更改为当前用户)。另请注意,这可能是一个严重的性能问题。
after_update 仅在您更新对象时触发。创建时不会调用 after_update。
当你想在创建新对象时调用方法时,你可以使用 after_create 回调。
after_create :assign_owner
after_update :assign_owner
def assign_owner
self.owner = "test"
end
【讨论】:
after_update 和 after_create 在对象保存后调用。您确实设置了 owner 的值,但没有保存它。
两种可能的选择:改用before_update --> 您的对象尚未保存,您的更改将正确保存。
或者使用after_update,写成如下:
def assign_owner
self.update_attribute :owner, "test"
end
注意:任何回调只会在保存之前或之后调用,所以Post.new.owner 仍然是错误的。但Post.create(:context => 'blabla') 应该正确触发它(或Post.new.save)。
希望这会有所帮助。
【讨论】: