2

我有一个Message模型,其中content属性(字符串)和sent属性(boolean)。一个消息的content应该是可修改的,直到它被发送,之后该字段应该变为只读。(其他属性仍可修改,如message_opened)。Rails ActiveRecord有条件地保护属性不被修改

我该如何做到这一点?我已经考虑覆盖readonly?(仅适用于记录级别),attr_readonly(不附条件)和验证(不知道如何验证content取决于其旧值和sent字段)。

回答

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以获取更多信息。

0

去了可能的答案,我想作为设置领域:

attr_readonly 

是最好的选择是将完全保护的那场没有需要自定义代码。

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