我有这样的模特:
class Person
has_many :phones
...
end
class Phone
belongs_to :person
end
我希望在满足某些条件时禁止更改与人相关的手机。禁止字段以html格式设置为disabled
。当我添加自定义验证来检查它时,即使手机没有更改,也会导致保存错误。我认为这是因为带有属性的哈希传递给
@person.update_attributes(params[:person])
并且有一些带有电话号码的数据(因为表单包含电话字段)。如何仅更新已更改的属性?或者如何创建在字段未更改时忽略保存的验证?或者也许我做错了什么?
答案 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
希望它有所帮助。