【问题标题】:Rails after_create callback can't access model's attributesRails after_create 回调无法访问模型的属性
【发布时间】:2010-04-07 16:20:11
【问题描述】:

我无法在 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。

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

【问题讨论】:

  • 非常有神论。看起来你的模型有问题
  • 在日志中尝试使用 self.color、self.gender、self.user_id。
  • @vlad.zloteanu...是的,我做到了...同样的事情发生了
  • 刚刚了解观察者...使用观察者会有什么不同吗?
  • oops... 其中一个属性实际上是一个虚拟属性,我在其中使用了 self.update_attribute 触发了 after_create

标签: ruby-on-rails activerecord model callback


【解决方案1】:

找出我自己的问题。

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

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

所以对于记录来说,update_attribute 会实际创建数据库记录(如果它还没有被创建)(并触发 after_create)。

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

【讨论】:

  • 对了,调用after_create的时候,所有的attr_accessor都已经设置好了(可以清除)。
【解决方案2】:

试试这个:

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

【讨论】:

  • 这就是我在观察者中的做法。
  • 如何将变量传递给 after_create?
【解决方案3】:

尝试使用 after_save 而不是 after_create 可能会奏效。不过没有经过测试。

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

【讨论】:

    【解决方案4】:

    一般来说,宏样式回调可能比简单地覆盖方法更好。它允许您在生命周期中同时触发几个不同的方法(如果您愿意)。我想你需要的是这样的:

    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
    

    【讨论】:

    • 是的,我也喜欢这种方法,但不会影响我的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多