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