2013-05-31 34 views
1

有沒有辦法讓text_field只用於日期時間屬性的日期部分?例如,我有一個名爲published_on的日期時間參數,並且我希望我的text_field只提交日期時間字段的日期(而不是時間)。這不起作用:帶text_field的日期時間表格

<%= f.text_field :published_on, :value=> (@step.published_on.strftime("%m/%d/%Y")), :ignore_time=>true %> 

並提交參數published_on而不是published_on(1I),published_on(2I),以及published_on(3I)(年度,小時和分鐘)。

編輯

我現在能夠得到的參數,但我有一個時區錯誤

這是我的控制器代碼:

date = params[:step][:published_on] 
logger.debug "date: #{date}" 
time = params[:step][:"published_on(4i)"] +":" + params[:step][:"published_on(5i)"] 
logger.debug "time: #{time}" 
dateTime = date+ " " + time 
logger.debug "dateTime: #{dateTime}" 
dateTime = DateTime.strptime(dateTime, '%m/%d/%Y %H:%M') 
logger.debug "datetime: #{dateTime}" 

params[:step][:published_on] = dateTime 

params[:step].delete :"published_on(4i)" 
params[:step].delete :'published_on(5i)' 

打印出以下日誌報表:

date: 01/01/2013 
time: 00:00 
dateTime: 01/01/2013 00:00 
datetime: 2013-01-01T00:00:00+00:00 

它se因爲時區設置爲默認(00:00),所以ems像時間不正確。有什麼辦法從表單傳遞時區?

回答

1

在您的表單中,使用不帶:value選項的text_field。

在您的控制器,請嘗試:

@your_model.published_on = DateTime.parse(params[:published_on]) 

這將設置日期,離開的時候,部分爲00:00午夜

+0

感謝您的幫助!當我嘗試解析published_on參數時,出現「無效日期」錯誤。這是我的控制器代碼: @ step.published_on = DateTime.parse(params [:step] [:published_on])。這是我的形式:<%= f.text_field:published_on,:ignore_time => true%> – scientiffic

+0

你在text_field中輸入了什麼字符串?例如'DateTime.parse(「1/2/2013」​​) => Wed,02 Jan 2013 00:00:00 + 0000'適合我。您可能需要添加額外的驗證,以確保文本字段中的數據具有「parse」識別的有效格式。 – Tilo

+0

文本字段以「05/31/2013」​​格式發送日期 – scientiffic

0

你必須有在視圖中text_field?

據我所知,你可以有一個date_time字段,然後使用兩個不同的輸入字段來設置字段的不同部分。

form_for @event do |f| 
    f.date_select :starts_at 
    f.time_select :starts_at, :ignore_date => true 
    f.submit 
end 

由於軌道的日期和時間選擇助手設置五個不同的參數(starts_at(1I)的年份部分,2I月的一部分,等等),這意味着,date_select只有將它們設置爲日期部分,而如果您將ignore_date => true傳遞給time_select,則只會設置小時和分鐘部分。

如果你必須有一個text_field我不知道該怎麼做,但在發送表單之前設置datetime參數之前可能會使用一些jQuery魔術。

+0

我想使用text_field,因此用戶可以從日期選擇器中選擇日期,我認爲這是比下拉菜單更好的UI。 – scientiffic

0

感謝Tilo的幫助,我終於明白了這一點。

這是我有我的方式:

<%= semantic_form_for [@project, @step], :html => {:multipart => true} do |f| %> 
    <%= f.inputs do%> 
     <%= f.text_field :published_on, :value=> (@step.published_on.strftime("%m/%d/%Y")), :ignore_time=>true %> at <%= f.time_select :published_on, :class=>"btn dropdown-toggle", :ampm=> true, :ignore_date=>true %> 
      <%= f.input :timeZone, :as=> :hidden, :value=> @step.published_on.zone%> 
    <% end %> 
<% end %> 

和我的控制器:

def update 
    @step = @project.steps.find_by_position(params[:id]) 
    @step.images.each do |image| 
     image.update_attributes(:saved => true) 
    end 
    date = params[:step][:published_on] 
    logger.debug "date: #{date}" 
    time = params[:step][:"published_on(4i)"] +":" + params[:step][:"published_on(5i)"] 
    logger.debug "time: #{time}" 
    timeZone = params[:step][:timeZone] 
    logger.debug "timeZone: #{timeZone}" 
    dateTime = date+ " " + time +" " + timeZone 
    logger.debug "dateTime: #{dateTime}" 
    dateTime = DateTime.strptime(dateTime, '%m/%d/%Y %H:%M %Z') 
    logger.debug "datetime: #{dateTime}" 

    params[:step][:published_on] = dateTime 

    params[:step].delete :"published_on(4i)" 
    params[:step].delete :'published_on(5i)' 
    params[:step].delete :timeZone 

    respond_to do |format| 
     if @step.update_attributes(params[:step]) 
     format.html { redirect_to project_steps_path(@project), :notice => 'Step was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render :action => "edit" } 
     format.json { render :json => @step.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

似乎粗略定義了一堆參數相同的對象,之後再刪除它們,但我不知道任何其他方式。