2

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

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

4

2 回答 2

3

事实证明验证是正确的方法:创建一个使用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

于 2013-05-01T11:39:07.663 回答
0

回顾可能的答案,我认为将字段设置为:

attr_readonly

最好的选择是它将完全保护该字段而无需自定义代码。

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

于 2015-09-13T05:13:52.697 回答