2010-04-07 82 views
4

我无法在after_create回调中访问我的模型的属性...似乎我应该能够正确吗?Rails 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> 

日志:(WTF!?)

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

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

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

+1

这是非常mithtic。在你的模型 – fl00r 2010-04-07 16:32:06

+0

中看起来有点不对,在日志中尝试使用self.color,self.gender,self.user_id。 – 2010-04-07 17:00:54

+0

@ vlad.zloteanu ...是的,我做了...同样的事情发生了 – tybro0103 2010-04-07 18:05:09

回答

4

想通了我自己的问题。

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

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

所以备案,update_attribute将实际创建数据库记录(以及触发after_create)如果尚未创建它。

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

+0

正确的是,当调用after_create时,所有的attr_accessors已经被设置(并且可以被清除)。 – 2012-07-31 06:36:05

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 
+0

这就是我在观察者中所做的。 – 2010-04-07 17:05:55

+0

你如何将一个变量传递给after_create? – tybro0103 2010-04-07 18:04:37

0

尝试使用after_save的,而不是after_create可能是工作。没有经过测试。

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

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 
+0

是的,我也喜欢这种方法,但它不会影响我的问题。 – tybro0103 2010-04-09 14:51:51