我有一個具有start_at
和end_at
屬性的模型。在最終用戶的表單中,我使用標準datetime_select
顯示start_at
,但我寧願沒有向用戶呈現第二個datetime選擇。我希望我可以創建兩個代表持續時間的字段;一個小時,另一個幾分鐘。我的問題是,在我看來,如何使用表單助手在編輯現有條目時自動填寫字段。此外,我如何將它連接到型號,然後使用實際屬性保存記錄,end_at
?如何使用多個表單字段與rails中的單個方法進行交互?
在此先感謝您提供的任何建議!
我有一個具有start_at
和end_at
屬性的模型。在最終用戶的表單中,我使用標準datetime_select
顯示start_at
,但我寧願沒有向用戶呈現第二個datetime選擇。我希望我可以創建兩個代表持續時間的字段;一個小時,另一個幾分鐘。我的問題是,在我看來,如何使用表單助手在編輯現有條目時自動填寫字段。此外,我如何將它連接到型號,然後使用實際屬性保存記錄,end_at
?如何使用多個表單字段與rails中的單個方法進行交互?
在此先感謝您提供的任何建議!
我必須這樣做了一堆,我已經做了以下內容:
params[:examplemodelname].delete :distance if params[:examplemodelname].has_key? :distance
ExampleModelName.new(params[:examplemodelname])
或@examplemodelname.update_attributes(params[:examplemodelname])
按照慣例。會不喜歡這樣的邏輯是更好 適合的模式?胖模型, 瘦身控制器?
我認爲這是絕對正確的。我鄙視使用控制器這樣的東西。在我看來,控制器最好用於幾件事情:視圖和模型之間
當然,每個人都必須找到自己的平衡點,但是我發現像這樣的「例外」往往會導致無處不在。更不用說控制器邏輯更難測試了。
要回答你的問題:你應該簡單地在模型中定義虛擬屬性,以幫助你在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會在持續時間之前或之後得到分配,並且可能會導致您的邏輯出現錯誤。
這樣的邏輯會不會更適合模型?胖模型,瘦身控制器? – bloudermilk
我對這種事情的一般規則是,在params對象中發生的事情應該發生在控制器而不是模型中。將日期顯示爲持續時間而不是結束值也似乎是視圖/控制器問題,而不是模型問題。 如果你在代碼中除了那個表單之外的其他地方關心這個持續時間,可能有必要把它放在模型中,但是對於這個用例來說,它似乎是一個很自然的代碼,或者可能是表單位的幫助器。 – corprew