我有一个包含 3 个 ActiveRecord 字段的表单。其中一个字段有一种愚蠢的、依赖于国家的验证要求。 (例如,如果在设置向导表单上创建对象,我仅验证该字段。)
在我的 POST 处理程序中创建对象时,我想我可以调用errors.add 来插入一个特殊的错误条件
@foo = Foo.new(params[:foo])
if goofy_conditions(params[:foo][:goofy_field])
@foo.errors.add(:goofy_field, "doesn't meet the goofy conditions" )
end
respond_to do |format|
if @foo.save
...
else
... redirect back to form (with error fields hilited)
然而,在控制器中执行 @foo.errors.add() 似乎没有做任何事情......如果其他字段通过验证,它不会阻止 save() 。
另一种方法是将自定义验证处理程序放入模型中...我知道使用 error.add(:field, 'msg') 在那里工作得很好...但在这种情况下,我的控制器如何将信息“传递”到验证器告诉它该字段是否需要验证。
这就是模型逻辑。看着自定义验证 http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations
class GoofyThing < ActiveRecord::Base
validate :goofy_attribute_is_goofy
def goofy_attribute_is_goofy
if goofy_conditions(self.goofy_field)
self.errors.add(:goofy_field, "doesn't meet the goofy conditions" )
end
end
end
然后它的行为就像任何其他验证一样。
Edit
您可以有条件地验证:if
option:
attr_accessible :via_wizard
validate :goofy_attribute_is_goofy, :if => lambda { self.via_wizard }
在你的控制器中:
class WizardController < ApplicationController
before_filter :get_object, :set_wizard
#...
def get_object
@object = GoofyThing.find(params[:id])
end
def set_wizard
@object.via_wizard = true
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)