2012-06-30 24 views
1

我有一個處方模型的Rails 3應用程序。該模型有許多字段,其中兩個是計算和顯示處方的持續時間。Rails 3中的日期和日期範圍

當前用戶在「3個月」等文本字段中輸入值,然後手動將日期時間輸入更改爲從現在開始的三個月。這似乎是一個完美的形式來自動爲用戶。

目前該領域是這樣的:治療的

時間

<%= f.text_field :duration, :class => "input-text" %> 

到期日期

<%= f.datetime_select :expiry, :order => [:day, :month, :year], :class => "input-text" %> 

所以,我的問題。我怎樣才能創造持續時間字段兩個下拉列表,如:

[1] [Day] 

用戶可以從第一個列表中選擇號碼,並在第二,他們可以選擇一天,一週或一個月。

他們使用持續時間選擇框選擇的值將被保存爲文本字符串,例如, 「1個月」和1個月內Time.now的值將作爲到期列中的日期時間值保存。

是這樣的可能嗎?如果是這樣,怎麼樣?

+1

您是否考慮過使用慢性寶石來解析文本字符串並生成到期列的時間值?這將解決您的問題,並消除用戶需要兩次/兩種不同方式輸入相同信息的需要。 –

回答

3

我會提供你會如何使用chronic gem一個例子,因爲它好像是專門做這個的目的:

require 'chronic' 
duration = "3 months" # => "3 months" 
Time.now # => 2012-07-09 18:43:50 -0700 
Chronic.parse(duration + " from now") # => 2012-10-09 18:43:55 -0700 

如果我正確理解你的使用情況,那麼你可以完全擺脫datetime選擇。詢問用戶文本的持續時間並將其分配給文本屬性。然後使用chronic從文本參數中確定時間值並將其分配給datetime屬性。額外的功勞可以異步獲取解析的時間值,並在提交表單之前將其顯示在頁面上,以便他們可以看到他們提交的內容是否合理。

0

首先,將你的持續時間字段改爲1-30的選擇菜單,或者你想要的任何數字。

在處理表單中的控制器動作

然後:

@prescription = Prescription.new(params[:prescrption]) 
@prescription.duration = "#{pluralize(params[:prescription][:duration], params[:prescription][:expiry])}" 
if params[:prescription][:expiry] == "Day" 
    @prescription.expiry = Time.now + params[:prescription][:duration].days 
elsif params[:prescription][:expiry] == "Week" 
    # Put week logic here 
elsif params[:prescription][:expiry] == "Month" 
    # Put month logic here 
end 

# Put the rest of the @prescription.save stuff here. 

這是一個有點冗長,但我認爲這是一種它與程時間是建立在紅寶石的方式......

+0

謝謝,我明白數字選擇會起作用,但我不明白你的代碼如何選擇日期,月份和年份。 – dannymcc

+0

對不起,我正在談論你的問題的第二部分。我的答案是假設您將第二個字段從datetime_select更改爲以「Day」,「Week」和「Month」作爲選項的常規選擇。不是這樣嗎? –

+0

不是這樣。不知道最好的辦法來解決這個問題! – dannymcc

1

你可以做一些簡單的,如:

Time.now + 10.days 

來源:How to add 10 days to current time in Rails

如何做下拉?

Drop down box in Rails

假設處方是在創建對象時有效,你可以存儲的開始日期在數據庫中的當前時間Time.now(可能要轉換爲datetime),然後根據下拉式,添加的時間,直到它像我的頭頂上過期:

eval "Time.now + #{params[:prescription][:amount].#{params[:prescription][:time_type]}" 

希望這是有道理的。我會尋找更好的方法來增加時間,儘管可能不使用eval。繼承人的時間參考:http://api.rubyonrails.org/classes/Time.html

+0

此外,我會建議一個數字輸入字段的時間單位數量,並與天,周,月,年下拉。您甚至可以使用pluralize方法確保它在輸入字段中輸入1時從不在下拉列表中顯示「1天」。 – AJcodez