如何检查在流程流程中是否设置了属性值?

时间:2012-05-05 17:07:54

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

我正在使用Ruby on Rails 3.2.2,我想知道是否有办法在流程流程中检查属性值是否已 set 。也就是说,我有一个Article类,其中包含属性titlecontentupdater_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(至少一次);如果在处理流程中没有设置它,那么我想提出错误或类似的东西。

有可能吗?如果是的话,如何做到这一点?

2 个答案:

答案 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