with_options条件给出未定义的方法错误

时间:2015-02-06 22:12:31

标签: ruby-on-rails ruby validation

我正在尝试简化模型上的验证。 在尝试使用模型中的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>

1 个答案:

答案 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