我正在使用Ruby on Rails 3.2.2,我想知道是否有办法在流程流程中检查属性值是否已 set 。也就是说,我有一个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
(至少一次);如果在处理流程中没有设置它,那么我想提出错误或类似的东西。
有可能吗?如果是的话,如何做到这一点?
答案 0 :(得分: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=
以保存字段已更新的标志,然后有一个方法来检查它是否已设置(可能是你想在验证中使用它还是什么?)。最后添加一个钩子以在保存对象时清除标志。
答案 1 :(得分: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