ruby-on-rails-3 – 防止在Rails模型中更改一个字段

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – 防止在Rails模型中更改一个字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个相关的模型 – 比如说活动和步骤.活动has_many:steps和Step belongs_to:活动,这意味着步骤表具有一个activity_id列.

这是在Hobo 1.3,所以Rails 3.0.

我想要的是确保在创建步骤之后不可能将步骤移动到另一个活动.我们不希望更改activity_id字段.

我从编辑表单中删除了该字段,但我正在寻找一个更强的约束.本质上,我想验证更新(而不是创建)列不被触摸. Hobo的文档没有提到Hobo中的任何内容,所以我正在看Rails validations,但到目前为止,我还没有发现我记得的“只做更新”约束,也没有发现某些东西不是改变.

解决方法

您可以使用attr_readonly:your_field_name将属性声明为read_only.
但是,如果您尝试编写此属性,则不会创建错误,它将以静默方式失败.
(所有sql更新将忽略此属性)

另一个选择可能是,为这种情况写一个验证,可能如下所示:

class Step < ActiveRecord::Base
  validate :activity_id_not_changed

  private

  def activity_id_not_changed
    if activity_id_changed? && self.persisted?
      errors.add(:activity_id,"Change of activity_id not allowed!")
    end
  end
end

坚持?返回true,如果这不是一个新的记录,它不会被销毁.

链接

http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-readonly_attributes

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

猜你在找的Ruby相关文章