0

我正在使用 Ruby on Rails 3.2.2,我想知道是否有办法检查在流程中是否设置了属性值。也就是说,我有一个Article具有属性title, content,的类updater_user_id

在我的控制器中,我有:

# @article.title
# => "Sample title"
# @article.content
# => "Sample content"
# @article.updater_user_id
# => 1

# @current_user.id
# => 1 # Note: This value is the same as '@article.updater_user_id'
@article.updater_user_id = @current_user.id

# params[:article]
# => {:article => {:title => 'Sample title 2', :content => 'Sample content 2'}}
@article.update_attributes(params[:article])

我尝试使用该@article.changed方法,但它不起作用,因为我希望它起作用。事实上,该方法返回:

@article.changed
# => ['title', 'content'] # Note: There isn't the 'updater_user_id' attribute

换句话说,我想检查是否updater_user_id在流程中设置了,即使该值没有改变。我的用例是我想在保存对象之前要求updater_user_id在流程中设置(至少一次);Article如果在流程中没有设置它,那么我想提出一个错误或类似的东西。

可能吗?如果是这样,如何做到这一点?

4

2 回答 2

0

你试过xxx_will_change!方法吗?

# in Article class
  def updater_user_id=(new_updater_user_id)
    self[:updater_user_id] = new_updater_user_id
    updater_user_id_will_change!
  end
于 2012-05-05T18:55:33.693 回答
0

我没有对此进行测试,可能会有一些无法预料的警告,但您可能会执行以下操作:

def updater_user_id=(val)
  @updater_user_id_set = true
  write_attribute :updater_user_id, val
end

def updater_user_id_set?
  @updater_user_id_set || updater_user_id_changed?
end

def clear_updater_user_id_set
  @updater_user_id_set = false
end
private :clear_updater_user_id_set

after_save :clear_updater_user_id_set

这将覆盖updater_user_id=以保存字段已更新的标志,然后有一种方法来检查它是否已设置(大概您想在验证或其他内容中使用它?)。最后添加一个钩子以在保存对象时清除标志。

于 2012-05-05T17:36:27.007 回答