如何拦截属性的赋值?

时间:2011-03-02 07:24:48

标签: ruby-on-rails ruby-on-rails-3

我有一个错误,在关联模型中,父模型的外键在关联模型表中显示为NULL。

为了追踪发生这种情况的原因,我想在每次分配属性时写入日志文件(即每次调用attr=方法)。

我该怎么做? Rails是否已经允许通过某种我不知道的方式来完成这项工作?

2 个答案:

答案 0 :(得分:1)

你可以通过简单地覆盖attr =方法来实现。例如:

class User
  def username= username
    Rails.logger.info "Setting username with #{username}"
    write_attribute :username, username
  end
end

您还可以通过链接方法来实现此目的。例如:

class User
  alias :username_old= :username=
  def username= username
    Rails.logger.info "Setting username with #{username}"
    self.username_old = username
  end
end

答案 1 :(得分:1)

我认为您可以使用回调方法(before_save)来检查对象的状态。 以下可能会帮助你...

article = Article.find(:first)
article.changed?  #=> false

# Track changes to individual attributes with
# attr_name_changed? accessor
article.title  #=> "Title"
article.title = "New Title"
article.title_changed? #=> true

# Access previous value with attr_name_was accessor
article.title_was  #=> "Title"

# See both previous and current value with attr_name_change accessor
article.title_change  #=> ["Title", "New Title"]