我有Message
模型,其中content
属性(字符串)和sent
属性(布尔值)。 消息content
应该可以修改,直到它被发送,之后该字段应该变为只读。(其他属性仍然可以修改,例如message_opened
)。
我怎样才能做到这一点?我已经研究过覆盖readonly?
(仅适用于记录级别),attr_readonly
(非条件)和验证(不知道如何验证content
依赖在旧值和sent
字段上。
答案 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 changed,Setting a field to read-only in Rails after it's created和http://api.rubyonrails.org/classes/ActiveModel/Dirty.html。
答案 1 :(得分:0)
考虑可能的答案,我认为将字段设置为:
attr_readonly
最好的选择是在没有自定义代码的情况下完全保护该字段。
列为readonly的属性将用于创建新记录但是 更新操作将忽略这些字段。