【问题标题】:Rails ActiveRecord conditionally protect an attribute from modificationRails ActiveRecord 有条件地保护属性不被修改
【发布时间】:2013-04-25 09:38:39
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord attributes readonly


    【解决方案1】:

    事实证明验证是正确的方法:创建使用attribute_changed?(“attribute”是属性名称,在本例中为“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

    【讨论】:

      【解决方案2】:

      查看可能的答案,我认为将字段设置为:

      attr_readonly
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 2016-12-27
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 2013-12-08
        • 1970-01-01
        相关资源
        最近更新 更多