1

有没有办法让 text_field 只用于 datetime 属性的日期部分?例如,我有一个名为published_on 的日期时间参数,我希望我的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

由于时区设置为默认值 (00:00),因此时间似乎不正确。有没有办法让时区从表单中传递过来?

4

3 回答 3

1

在您的表单中,使用不带 :value 选项的 text_field。

在您的控制器中,尝试:

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

这将设置日期,并将时间部分保留为午夜 00:00

于 2013-05-31T21:07:06.787 回答
0

多亏了蒂洛的帮助,我终于弄明白了。

这就是我的表格:

<%= 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

为同一个对象定义一堆参数并稍后删除它们似乎很粗略,但我不知道有任何其他方法。

于 2013-06-01T01:06:25.417 回答
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

由于 rails 日期和时间选择助手设置了五个不同的参数(年份部分为 starts_at(1i),月份部分为 2i,等等),这意味着 date_select 只为日期部分设置它们,而如果你通过:ignore_date => true 到 time_select,它只会设置小时和分钟部分。

如果你必须有一个 text_field 我不知道该怎么做,但在发送表单之前设置日期时间参数之前,可以使用一些 jQuery 魔法。

于 2013-05-31T21:23:12.290 回答