在控制器中,我有一个直接与模型无关的代码:
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
之后立即向模型添加验证错误?
答案 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
,然后在var1
为nil
的情况下重定向到某个页面:
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以供参考。