2014-02-08 117 views
2
class Task < ActiveRecord::Base 
    validates :name, presence: true, 
    validates :name, length: { minimum: 4, maximum: 255 } 
end 

如果「名稱」值丟失的所有驗證程序將運行,並且我將獲得2個錯誤:一是從存在驗證器和一個從長度驗證,「名」太短。我如何鏈接這兩個因此第一次失敗停止驗證隊列。ActiveRecord的驗證器鏈接

謝謝!

+0

是的,應該這樣做,但我認爲是其他「正確」的方法來做到這一點。謝謝! – Viorel

回答

1

你可能不希望這樣做,

你可能想要做的是編輯的渲染錯誤的視圖助手只能說明你在每一個屬性鏈中的第一個錯誤,然後你可能會想要切換長度和存在驗證者的地方:)

當你說「如果我們有一些驗證器在做一些廣泛的工作」,並且afaik沒有優雅的話,我會得到你的意思建立這種方式。

在自定義驗證器的形式中返回false會暫停回調鏈,並使用另一個問題中所述的:if:unless體操。

看看ActiveModel::Validations#run_validations!是如何工作的(用pry戳對象),你可能會在那裏得到一些見解,使你能夠將更優雅的解決方案解決到你的問題 - 不是很優雅的想法,使用黑客入侵的方法可能會很優雅,但實現本身可能會非常黑客。


說了這麼多,從這個帖子保留的是:

你可能在這點上過早的優化和重驗證,你可能做在某些時候可能會是使用不同的更分層的架構(使用自定義的驗證器集合來創建表單類,例如參見7 Patterns to Refactor Fat ActiveRecord Models中的Form類)

+1

上面的例子很簡單,但情況並非總是如此。如果我們有一些驗證器做了一些廣泛的工作(如db查詢,api查詢等),該怎麼辦?因爲我們已經失敗了,所以通過整個鏈條是沒有意義的。 – Viorel

+0

@Viorel,更新回答 – bbozo

+0

我不是過早地優化,我只是學習活躍的記錄:)。只是想知道我能否做到這一點。謝謝您的回答! – Viorel