【问题标题】:how can a controller manually set validation errors for a certain field控制器如何为某个字段手动设置验证错误
【发布时间】:2012-09-22 21:10:18
【问题描述】:

我有一个包含 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()。

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

【问题讨论】:

  • 在模型上放置一个非持久属性,比如向导,根据需要进行设置,然后在 nrmal 验证中使用它?

标签: ruby-on-rails validation


【解决方案1】:

这就是模型逻辑。看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

然后它会像任何其他验证一样工作。

编辑

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

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

【讨论】:

  • 啊! attr_accessible :via_wizard 是我错过的。非常感谢!
猜你喜欢
  • 2011-04-05
  • 2011-07-02
  • 1970-01-01
  • 2021-12-29
  • 2018-07-11
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多