2010-01-31 42 views
1

我有一個具有start_atend_at屬性的模型。在最終用戶的表單中,我使用標準datetime_select顯示start_at,但我寧願沒有向用戶呈現第二個datetime選擇。我希望我可以創建兩個代表持續時間的字段;一個小時,另一個幾分鐘。我的問題是,在我看來,如何使用表單助手在編輯現有條目時自動填寫字段。此外,我如何將它連接到型號,然後使用實際屬性保存記錄,end_at如何使用多個表單字段與rails中的單個方法進行交互?

在此先感謝您提供的任何建議!

回答

1

我必須這樣做了一堆,我已經做了以下內容:

  1. 使用FormTagHelper版本的話費爲外地進行特殊處理。
  2. 在控制器中,從params對象中讀取form_tag值。
  3. 刪除多餘的值:
  
    params[:examplemodelname].delete :distance if params[:examplemodelname].has_key? :distance 
  • 把 '真實' 值到params對象(在你的例子,ends_at)
  • 呼叫ExampleModelName.new(params[:examplemodelname])@examplemodelname.update_attributes(params[:examplemodelname])按照慣例。
  • +0

    這樣的邏輯會不會更適合模型?胖模型,瘦身控制器? – bloudermilk

    +0

    我對這種事情的一般規則是,在params對象中發生的事情應該發生在控制器而不是模型中。將日期顯示爲持續時間而不是結束值也似乎是視圖/控制器問題,而不是模型問題。 如果你在代碼中除了那個表單之外的其他地方關心這個持續時間,可能有必要把它放在模型中,但是對於這個用例來說,它似乎是一個很自然的代碼,或者可能是表單位的幫助器。 – corprew

    0

    會不喜歡這樣的邏輯是更好 適合的模式?胖模型, 瘦身控制器?

    我認爲這是絕對正確的。我鄙視使用控制器這樣的東西。在我看來,控制器最好用於幾件事情:視圖和模型之間

    1. 改組數據,ALA CRUD操作
    2. 訪問控制(通常與before_filters)
    3. 支持花哨的UI操作(多重選擇,嚮導等)

    當然,每個人都必須找到自己的平衡點,但是我發現像這樣的「例外」往往會導致無處不在。更不用說控制器邏輯更難測試了。

    要回答你的問題:你應該簡單地在模型中定義虛擬屬性,以幫助你在start_at和持續時間之間進行轉換。類似於:

    # Return the duration in seconds. Will look different if you want to use 
    # multiparameter assignment (which you definitely should consider) 
    def duration 
        (end_at - start_at).seconds 
    end 
    
    # Store the duration as an instance variable. Might need to use multiparameter 
    # assignment if you use a time_select() in the view. 
    def duration=(arg) 
        @duration = arg 
    end 
    
    before_save :set_end_at 
    def set_end_at 
        end_at = start_at + @duration.seconds 
    end 
    

    我通常將before_save中的實際屬性設置爲避免表單賦值中的任何競爭條件。您無法保證start_at會在持續時間之前或之後得到分配,並且可能會導致您的邏輯出現錯誤。

    相關問題