我有一个Message
带有content
属性(字符串)和sent
属性(布尔值)的模型。消息content
在发送之前应该是可修改的,之后该字段应该变为只读。(其他属性仍然可以修改,例如message_opened
)。
我怎样才能做到这一点?我已经研究过覆盖readonly?
(仅适用于记录级别)、attr_readonly
(非条件)和验证(不知道如何使content
依赖于其旧值和sent
字段的验证)。
我有一个Message
带有content
属性(字符串)和sent
属性(布尔值)的模型。消息content
在发送之前应该是可修改的,之后该字段应该变为只读。(其他属性仍然可以修改,例如message_opened
)。
我怎样才能做到这一点?我已经研究过覆盖readonly?
(仅适用于记录级别)、attr_readonly
(非条件)和验证(不知道如何使content
依赖于其旧值和sent
字段的验证)。
事实证明验证是正确的方法:创建一个使用attribute_changed?
(“attribute”是属性的名称,在本例中为“content”)和条件验证的自定义验证。
消息.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 检查属性是否更改、在 Rails 中将字段设置为只读以及http://api.rubyonrails.org/classes/ActiveModel/Dirty.html。
回顾可能的答案,我认为将字段设置为:
attr_readonly
最好的选择是它将完全保护该字段而无需自定义代码。
列为只读的属性将用于创建新记录,但更新操作将忽略这些字段。