有没有办法让text_field只用于datetime属性的日期部分?例如,我有一个名为published_on的datetime参数,我希望我的text_field只提交datetime字段的日期(而不是时间)。这不起作用:
<%= 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)。有没有办法从表单中获取时区?
答案 0 :(得分:1)
在表单中,使用text_field而不使用:value选项。
在您的控制器中,尝试:
@your_model.published_on = DateTime.parse( params[:published_on] )
这将设置日期,并将时间部分保留为午夜00:00
答案 1 :(得分: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 =&gt;对于time_select,它只会设置小时和分钟部分。
如果你必须有text_field我不知道怎么做,但是在发送表单之前设置datetime参数之前可以使用一些jQuery魔法。
答案 2 :(得分: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
为同一个对象定义一堆参数并稍后删除它似乎很粗略,但我不知道其他任何方法。