Rails after_create回调无法访问模型的属性

时间:2010-04-07 16:20:12

标签: ruby-on-rails activerecord model callback

我无法在after_create回调中访问我的模型属性......看起来我应该能够正确吗?

控制器:

@dog = Dog.new(:color => 'brown', :gender => 'male')
@dog.user_id = current_user.id
@dog.save

模型:

class Dog < ActiveRecord::Base
  def after_create
    logger.debug "[DOG CREATED] color:#{color} gender:#{gender} user:#{user_id}"
  end
end

控制台:(一切似乎都很好)

>>Dog.last
=>#<Dog id: 1, color: "brown", gender: "male", user_id: 1>

log:(wtf!?)

...
[DOG CREATED] color: gender:male user
...

我的一些属性显示出来,而其他属性则不显示!不好了!谁知道我做错了什么?我过去总是能够以这种方式使用after_create。

注意:我使用的实际变量名称和值是不同的,但方法和代码是相同的。

4 个答案:

答案 0 :(得分:4)

弄清楚我自己的问题。

其中一个属性是虚拟属性,我在其中使用了self.update_attribute ... oops!

def price=(amt)
  self.update_attribute(:price_in_cents, (amt*100.0).to_i)
end

因此,对于记录,如果尚未创建,update_attribute将实际创建数据库记录(并触发after_create)。

下次我一定要发布完整的代码!

答案 1 :(得分:0)

请改为尝试:

class Dog < ActiveRecord::Base
  def after_create(dog)
    logger.debug "[DOG CREATED] color:#{dog.color} gender:#{dog.gender} user:#{dog.user_id}"
  end
end

答案 2 :(得分:0)

尝试使用after_save代替after_create可能有效。虽然没有经过测试。

after_create()在Base.save之后调用尚未保存的新对象(不存在记录)。请注意,此回调仍包含在围绕保存的事务中。例如,如果此时调用外部索引器,则不会在数据库中看到更改。

答案 3 :(得分:0)

宏观样式回调通常比简单地覆盖方法更好。它允许您在生命周期中同时触发几种不同的方法(如果需要)。我想你需要的是:

class Dog < ActiveRecord::Base
  after_create :dog_logger

  def dog_logger
        logger.debug "[DOG CREATED] color:#{self.color} gender:#{self.gender} user:#{self.user_id}"
  end
end