控制器如何手动设置某个字段的validation错误

我有一个包含3个ActiveRecord字段的表单。 其中一个领域有一些愚蠢的,以及STATE-DEPENDENTvalidation要求。 (例如,如果在安装向导表单上创建对象,我只validation该字段。)

在我的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()似乎没有做任何事情……如果其他字段通过validation,它不会阻止save()。

另一种方法是将自定义validation处理程序放入模型中……我知道使用errors.add(:field,’msg’)可以正常工作……但在这种情况下,我的控制器如何将’传递’信息传递给validation器告诉它该字段是否需要validation。

这是模型逻辑。 查看自定义validation

 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 

然后它就像任何其他validation一样。

编辑

您可以使用:if选项有条件地validation:

 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