我正在尝试简化模型上的验证。 在尝试使用模型中的with_options重构之前,我有:
# model
validates :number_of_locations, presence: true, if: -> { required_for_step?(:business_details) }
def required_for_step?(step)
return true if form_step.nil?
return true if self.form_steps.index(step.to_s) <= self.form_steps.index(form_step)
end
这完全可以将表单步骤传递给required_for_step吗? function并根据用户所在表单的步骤返回一个值。这意味着我正在正确地访问“步骤”。
我有大约30个字段供这个模型有条件地验证(我在这里只显示一个去除杂乱,但使用with_options会使我的模型更有条理,我能够重构条件语句。这是不起作用的:
# model
with_options :if => required_for_step?(:business_details) do |step|
step.validates :number_of_locations, presence: true
end
def required_for_step?(step)
return true if form_step.nil?
return true if self.form_steps.index(step.to_s) <= self.form_steps.index(form_step)
end
返回的错误是:
undefined method `required_for_step?' for #<Class:0x007f82c2919438>
答案 0 :(得分:0)
您无法从条件中删除-> { ... }
部分。这定义了一个lambda,在验证模型时调用并评估它。如果没有lambda,代码会在加载类时立即运行(以后再也不会再运行)。
with_options :if => -> { required_for_step?(:business_details) } do |step|
step.validates :number_of_locations, presence: true
end
private
def required_for_step?(step)
form_step.nil? ||
form_steps.index(step.to_s) <= form_steps.index(form_step)
end