0

我對Ruby相當陌生,所以我希望我錯過了一些明顯的東西。我有一個應用程序,通過驗證使用類似這樣的表單...使用ActiveSupport時Ruby中的條件驗證

module FormValidations 
    extend ActiveSupport::Concern 
    included do 

    validates :field_1, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 
    validates :field_2, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 
    validate :field_sec, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 

    def field_sec 
     (*some custom stuff*) 
    end 

...等等,它工作正常。

我現在有一種新的表單,它使用相同的模型和數據庫結構,但有點設置爲不同的東西。它也經歷了一個完全不同的驗證過程。我一直在試圖找到一種方法,所以要確認通話條件,像...

included do 

    validate :form_switch, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 

    def form_switch 
    #This uses a method I defined in the model to tell which form is active 
    if is_special_form == true 
     validates :field_245, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 
     validates :field_432, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 
    else 
     validates :field_1, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 
     validates :field_2, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] } 
    end 
    end 

...但「驗證」放置的方法的內部時,拋出一個錯誤。

我還玩弄了兩個單獨的驗證腳本文件,這些文件被包含到我的表單模型中,但是由於該過程是用一個簡單的「.valid?」執行的方法,我不知道如何區分該級別的腳本。

是否有方法使用單個模型在兩個(或多個)驗證集之間切換?

回答

1

你可以做所有的條件驗證。我認爲沒有必要將一切都嵌入到如此深的層面。由於包括的塊的內容將在你的模型類的上下文中執行,這應該工作:

included do 
    validates :field_245, :if => :validate_field_245? 
    validates :field_432, :if => :validate_field_432? 
    validates :field_1, :if => :validate_field_1? 
    validates :field_2, :if => :validate_field_2? 

    def validate_field_245? 
    is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY] 
    end 

    def validate_field_432? 
    is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY] 
    end 

    def validate_field_1? 
    !is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY] 
    end 

    def validate_field_2? 
    !is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY] 
    end 
end 

一旦你使用不同的驗證條件看,你這是要考慮using form objects處理驗證邏輯的好時機。 simple_formreform庫使它變得容易。

+0

好主意。儘管如此,我可以通過使兩種方法(特殊和特殊)而不是許多來簡化它,因爲內容不依賴於任何特定於字段的內容。我嘗試後會發佈更多內容。 – ThisLanham