2015-02-06 41 views
0

我想簡化模型上的驗證。 嘗試之前重構模型中的我有使用with_options: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?函數,並根據用戶所在表單的步驟返回一個值。這意味着我正在訪問'步驟'。

我有大約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

你不能從你的條件刪除-> { ... }部分定義了拉姆達,一塊被稱爲並在驗證模型時進行評估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 
+0

謝謝你,工作。 – Questifer 2015-02-06 22:32:12

相關問題