2013-01-14 36 views
0
:inclusion => {:in => r = (1..15), :min => r.first, :max => r.last} 

這是我的工作代碼。我想讓動態的東西是「15」部分,例如:Rails驗證變量proc

:inclusion => {:in => r =(1..Vehicle.max_passengers),:min => r.first,:最大=> r.last}

我已經定義了以下類方法:

def self.max_passengers 
    15 
end 

當然沒有奏效。我已經嘗試過使用Procs和lambdas,但它無法正常工作。 :( 有人可以幫我用這個 - 是否有可能?

+0

你能發佈你所得到的錯誤?因爲您發佈的更改對我來說看起來很好。 – Tigraine

+0

範圍:)或其他類似的東西。我得到了它的工作......但我無法得到「r」值:r.first,r.last。當我刪除它的時候它可以工作,但是當它們出現時,它會拋出,沒有方法max_passengers用於Class :: class – Dmitri

+0

旁註:使用常量 – apneadiving

回答

3

你正在尋找一個custom validation method

ActiveRecord::Base.class_eval do 
    def self.validates_max_passenger(attr_name, r) 
    validates attr_name, :inclusion => { :in => r, :min => r.first, :max => r.last } } 
    end 
end 

# later in your class of choice:  
validates_max_passenger :passengers, 1..5 

或者,你可以嘗試用拉姆達以下

def self.max_passengers 
    1..15 
end 


validates :attrib, :inclusion => {:in => lambda { |obj| ClassName.max_passengers } } 

請注意,如果你在使用範圍:in你將不再需要的最小/最大。

+0

謝謝。但是,如果沒有自定義驗證,它可以完成嗎? – Dmitri

+1

如何定義常量?例如: 'MAX_PASSENGERS = 15' then: ':inclusion => {:in => r =(1..MAX_PASSENGERS),:min => r.first,:max => r.last}' I認爲這就是你試圖用你的類方法實現的。 – Amir

+0

謝謝。這也是一個選項。這只是,我知道一個事實,例如,這種結構將工作: def self.max_passengers (1..10) end 然後,使用lambda或proc,它將被正確嵌入。我只是無法得到它,爲什麼它不同,當我只想要它的一部分。 – Dmitri

1

檢查validates_with是否有任何幫助。此幫手將記錄傳遞給一個單獨的類進行驗證,您可以在其中驗證標準動態,即通過閱讀。一些配置或者等上validates_with 更多信息,請訪問Ruby on Rails的guide

class Person < ActiveRecord::Base 
    validates_with GoodnessValidator 
end 

class GoodnessValidator < ActiveModel::Validator 
    def validate(record) 
    # implement your dynamic criteria here     
    end 
end 
0

試試這個:

inclusion: { in: proc { 1..Vehicle.max_passengers } }