2009-12-21 41 views
2

我有一個Event模型與finish_time場,並呼籲whenever形式複選框。當whenever被選中我想在參數設置finish_timenil不管它的價值,當whenever不檢查我想確保finish_time是一個有效的日期之前,我將它保存在數據庫中。使用參數來控制導軌驗證


目前我使用的事件whenever attr_accessor實現這一點:

params[:event][:finish_time] = nil if whenever = params[:event].delete(:whenever) 
@event = Event.new(params[:event]) 
@event.whenever = whenever 

和使用條件的驗證檢查finish_time如果wheneverfalse

validates_presence_of :finish_time, :unless => @whenever 

我不滿意這個重複eates。 finish_time可以是nil的唯一方法是如果whenevertrue,並且如果您更改了一個,則經常需要更改另一個。如果Event更新爲新的finish_time,則whenever也必須更改爲false

理想情況下,我想將驗證移動到我的控制器。做直銷模式進入whenever時,這樣可以通過設置finish_timenull很容易地表示,但用戶張貼到/事件將在如果他們沒有表示的選擇得到喊道。但是我無法想出一種方法來有條件地向控制器添加或刪除Event的驗證,或者即使這是最好的方法。

刪除此重複的最佳方法是什麼?

回答

1

,而不是試圖解決通過驗證的問題,你可以嘗試解決這一問題的「Ruby的方式。」

除了驗證之外,您可能還想勾選finish_timewhenever方法的變體。

class Event < ActiveRecord::Base 
    # Validate presence 
    validates_presence_of :finish_time, :unless => @whenever 

    def whenever=(yes) 
    write_attribute(:whenever, yes) 
    write_attribute(:finish_time, nil) if yes? 
    end 
    def finish_time=(time) 
    write_attribute(:whenever, false) 
    write_attribute(:finish_time, time) 
    end 
end 

然後,你可以試試(但是,我不知道它是否有效):

@event = Event.new(params[:event]) 

編輯:然而,這將使合成領域看訂單assignemnts發生,因此如果賦值順序改變,相同參數集的結果可能會有所不同。這不太可能是你想要的。所以你必須按你想要的方式調整你的運營商。

而且你也應該明白,你不能讓你的代碼幹,除非你讓你的要求乾的。

編輯#2:我想你應該考慮刪除的要求爲finish_timenil如果whenever設置爲true。然後您可以按照上述相同的方式修改訪問器。

+0

關於保持我的要求乾的好點。也許有一些日期值不是null可能表示「不關心」而不是空的?我認爲問題來自於創造一個價值意味着兩件事。我想不出有什麼辦法可以求助於魔法數字。 – maxhawkins 2009-12-21 02:37:49

+0

編輯答案需要建議 – 2009-12-21 02:45:33

+0

這很有道理。謝謝! – maxhawkins 2009-12-21 02:49:23