我有一个 Message
模型,其中包含 content
属性(字符串)和 sent
属性( bool 值)。 消息的内容
在发送之前应该是可以修改的,之后该字段应该变为只读。(其他属性仍然可以修改,例如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 check if attribute changed , Setting a field to read-only in Rails after it's created和 http://api.rubyonrails.org/classes/ActiveModel/Dirty.html了解更多信息。
关于ruby-on-rails - Rails ActiveRecord 有条件地保护属性不被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317316/