当条件满足时,如何在模型中将某些字段设置为只读?

时间:2009-12-29 13:57:32

标签: ruby-on-rails validation forms readonly

我有这样的模特:

class Person
  has_many :phones
  ...
end

class Phone
  belongs_to :person
end

我希望在满足某些条件时禁止更改与人相关的手机。禁止字段以html格式设置为disabled。当我添加自定义验证来检查它时,即使手机没有更改,也会导致保存错误。我认为这是因为带有属性的哈希传递给

@person.update_attributes(params[:person])

并且有一些带有电话号码的数据(因为表单包含电话字段)。如何仅更新已更改的属性?或者如何创建在字段未更改时忽略保存的验证?或者也许我做错了什么?

3 个答案:

答案 0 :(得分:5)

您可以使用

changed  # => []
changed? # => true|false
changes  # => {}

提供的方法。

changed方法将返回一组已更改的属性,您可以执行include?(...)反对来构建您要查找的功能。

也许像

validate :check_for_changes

def check_for_changes
  errors.add_to_base("Field is not changed") unless changed.include?("field")
end

答案 1 :(得分:0)

def validate
  errors.add :phone_number, "can't be updated" if phone_number_changed?
end

- 不知道这是否适用于协会

其他方法是覆盖update_attributes,查找未更改的值,并从params哈希中删除它们,最后调用原始update_attributes。

答案 2 :(得分:0)

为什么不在模型中使用before_create,before_save回调来限制创建/更新/保存/删除或几乎任何此类操作。我想联系观察者来决定是否要限制创建或允许;这将是一个很好的方法。以下是一个简短的例子。

class Person < ActiveRecord::Base

   #These callbacks are run every time a save/create is done.
   before_save :ensure_my_condition_is_met
   before_create :some_other_condition_check


   protected
   def some_other_condition_check
     #checks here
   end

   def ensure_my_condition_is_met
     # checks here
   end
end

有关回调的更多信息,请点击此处: http://guides.rubyonrails.org/activerecord_validations_callbacks.html#callbacks-overview

希望它有所帮助。