Rails ActiveRecord有条件地保护属性不被修改

时间:2013-05-01 11:30:17

标签: ruby-on-rails ruby-on-rails-3 activerecord attributes readonly

我有Message模型,其中content属性(字符串)和sent属性(布尔值)。 消息content应该可以修改,直到它被发送,之后该字段应该变为只读。(其他属性仍然可以修改,例如message_opened)。

我怎样才能做到这一点?我已经研究过覆盖readonly?(仅适用于记录级别),attr_readonly(非条件)和验证(不知道如何验证content依赖在旧值和sent字段上。

2 个答案:

答案 0 :(得分:3)

结果验证是正确的方法:创建使用attribute_changed?的自定义验证(“属性”是属性的名称,在本例中为“content”)和条件验证。

Message.rb:

validate_on_update :reject_modifying_content, if: :sent?

def reject_modifying_content
 errors[:content] << "can not be changed!" if self.content_changed?
end

有关详细信息,请参阅Rails 3 check if attribute changedSetting a field to read-only in Rails after it's createdhttp://api.rubyonrails.org/classes/ActiveModel/Dirty.html

答案 1 :(得分:0)

考虑可能的答案,我认为将字段设置为:

attr_readonly

最好的选择是在没有自定义代码的情况下完全保护该字段。

  

列为readonly的属性将用于创建新记录但是   更新操作将忽略这些字段。