我无法在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。
注意:我使用的实际变量名称和值是不同的,但方法和代码是相同的。
答案 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