before_update语法

时间:2011-03-27 04:26:47

标签: ruby-on-rails ruby callback rails-activerecord

post.rb模型

   after_update :assign_owner

   def assign_owner
      self.owner = "test"
   end

上述方法适用于终端,但不会更改Rails中Post.new.owner的值。我错过了什么?

3 个答案:

答案 0 :(得分:4)

这是更新后(对象需要保存)所以

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

答案 1 :(得分:1)

after_update仅在您更新对象时触发。创建时,after_update不会调用。

如果要在创建新对象时调用方法,可以使用after_create回调。

  after_create :assign_owner
   after_update :assign_owner

   def assign_owner
      self.owner = "test"
   end

答案 2 :(得分:0)

保存对象后会调用

after_updateafter_create。您确实设置了owner的值,但是您没有保存它。

两种可能的选择:使用before_update代替 - &gt;您的对象尚未保存,您的更改将得到正确保存。

或使用after_update并按如下方式编写:

def assign_owner
  self.update_attribute :owner, "test"
end

注意:任何回调只会在保存之前或之后立即调用,因此Post.new.owner仍然是错误的。但Post.create(:context => 'blabla')应正确触发(或Post.new.save)。

希望这有帮助。