在Rails 4中的控制器中添加验证错误

时间:2015-11-04 08:24:10

标签: ruby-on-rails ruby ruby-on-rails-4

在控制器中,我有一个直接与模型无关的代码:

def create

  var1 = get_some_post_param
  # check if var1 isn't nil -- how to add an error the model if it is?

  # some other code...
  @m = Model.new(field1: var1, field2: var2, field3: var3)
  if @m.save
    # ok
    #....
  else
    # error
    ...
  end
end

如果var1 = get_some_post_param为零,我如何在var1之后立即向模型添加验证错误?

1 个答案:

答案 0 :(得分:3)

首先,我不认为你可以直接在你的控制器中做到这一点。

您可以将非模型var1属性与您的任何一个模型属性相关联(这可以是用于此目的的新属性,例如:special_var1)。

然后在您的控制器中,您可以:

  before_action :set_special_var1

  def set_special_var1
    var1 = get_some_post_param
    @m.special_var1 = var1
  end

然后,在您的模型中,您可以添加自定义验证器:

# model.rb
validate :special_var1_is_not_nil

private

def special_var1_is_not_nil
  if self.special_var1.nil?
    errors.add(:special_var1, 'special_var1 is nil')
  end
end

或者,您也可以尝试:

validates :special_var1, allow_nil: false

但是,在对象被持久化之前将调用这些验证,例如当你致电:@m.save时,而不是之前。

更新

您可以在控制器中做的最好的事情是,在控制器中设置before_action,然后在var1nil的情况下重定向到某个页面:

before_action :check_var1

private

def check_var1
  var1 = get_some_post_param
  unless var1
    redirect_to "index", notice: "Invalid var1"
  end
end

请参阅this post以供参考。