Rails 3.1 text_field表单助手和jQuery datepicker日期格式

我在我的Rails视图中有一个表单字段,如下所示:

 "datepicker" %> 

javascript函数将该类的所有输入字段转换为jQueryUI日期选择器。

 $(".datepicker").datepicker({ dateFormat : "dd MM yy", buttonImageOnly : true, buttonImage : "", showOn : "both", changeMonth : true, changeYear : true, yearRange : "c-20:c+5" }) 

到现在为止还挺好。 我可以编辑记录,它会将日期正确地保存到数据库中。 我的问题是当我想再次编辑记录时。 当表单从记录中预先填充时,它以’yyyy-mm-dd’格式显示。 javascript只格式化在datepicker控件中选择的日期。 有什么方法可以格式化从数据库中检索的日期? 我可以在哪个阶段这样做?

谢谢,丹妮。

在下面的讨论之后的一些更多细节,我的表单分布在两个文件,一个视图和一个部分。 这是观点:

  "put") do %>    f %>     

这是_fields局部视图:

 

"datepicker" %>

控制器代码:

 def edit_individual @shows = Show.find(params[:show_ids]) end 

我在environment.rb添加了以下内容:

 Date::DATE_FORMATS.merge!( :default => "%d %B %Y" ) 

现在,当我在视图中使用@ show.date时,它显示正确的格式,但表单助手仍然显示原始格式。

JQuery datepicker不会格式化预先填充的日期。
您需要使用带有textfield的格式化日期而不是具有默认“yyyy-mm-dd”格式的原始日期来在轨道侧处理它。

示例 –

 <%= f.text_field :date, :class => "datepicker", :value => @model.date.strftime("%d %m %Y") %> 

更多示例@Rails在text_field中的日期格式

已解决:我按照上面Jayendra的建议传递:value => show.date 。 它无法工作的原因是因为我没有从父视图传递show对象。 我更改了render线以包含它 – 父视图现在看起来像这样:

 <%= form_tag("/shows/update_individual", :method => "put") do %> <% for show in @shows %> <%= fields_for "shows[]", show do |f| %> <%= render "fields", :f => f, :show => show %> <% end %> <% end %> <%= submit_tag "Submit"%> <% end %> 

如果您使用的是mysql数据库,则可以在查询本身中格式化日期。

示例代码

  date_format(date_field,"%d %m %y") 

我最终做的是创建一个普通的文本输入并用ISO格式的日期和其他信息预填充它以将其标记为日期输入(例如,rel =“date”)。

在客户端,我有JavaScript来创建一个新的隐藏输入,它接受原始字段的名称(从而覆盖它,为了更好的衡量,我也删除了原始的名称属性)。 datepicker附加到原始字段,并使用altField / altFormat将隐藏字段与ISO日期同步。

 // used in jQuery's .each function create_datepicker_for(_, el) { var e = $(el), mirror, date; // attach a hidden field that mirrors the proper date mirror = $('') .prop('name', e.prop('name')) .insertAfter(e); if (e.val()) { date = new Date(e.val()); } e .prop('name', '') /* make sure this is not sent to the application */ .datepicker({ altField: mirror, /* "mirror" is the hidden field */ altFormat: 'yy-mm-dd' /* you do not want anything but ISO */ }); if (date) { e.datepicker('setDate', date) } } 

这似乎可以使所有内容保持同步,将正确的日期格式发送到应用程序,并且会像任何人期望的那样降级。