我的Rails视图中有一个表单字段,如下所示:
<%= f.text_field :date, :class => "datepicker" %>
javascript函数将该类的所有输入字段转换为jQueryUI日期选择器。
$(".datepicker").datepicker({
dateFormat : "dd MM yy",
buttonImageOnly : true,
buttonImage : "<%= asset_path('iconDatePicker.gif') %>",
showOn : "both",
changeMonth : true,
changeYear : true,
yearRange : "c-20:c+5"
})
到目前为止一切顺利。我可以编辑记录,它会将日期正确地保存到数据库中。我的问题是当我想再次编辑记录时。当表单从记录中预先填充时,它以'yyyy-mm-dd'格式显示。 javascript只格式化在datepicker控件中选择的日期。有什么办法可以格式化从数据库中检索的日期吗?我可以在哪个阶段这样做?
谢谢, 达尼。
以下讨论后的更多细节,我的表单分布在两个文件中,一个视图和一个部分文件。以下是观点:
<%= form_tag("/shows/update_individual", :method => "put") do %>
<% for show in @shows %>
<%= fields_for "shows[]", show do |f| %>
<%= render "fields", :f => f %>
<% end %>
<% end %>
<%= submit_tag "Submit"%>
<% end %>
这是_fields
部分视图:
<p>
<%= f.label :name %>
<%= f.text_field :name %>
</p>
<p>
<%= f.date %>
<%= f.label :date %>
<%= f.text_field :date, :class => "datepicker" %>
</p>
控制器代码:
def edit_individual
@shows = Show.find(params[:show_ids])
end
我在environment.rb
中添加了以下内容:
Date::DATE_FORMATS.merge!(
:default => "%d %B %Y"
)
现在,当我在视图中使用@ show.date时,它显示正确的格式,但表单助手仍然显示原始格式。
答案 0 :(得分:11)
JQuery datepicker不会格式化预先填充的日期 您需要使用带有textfield的格式化日期来处理它,而不是使用默认的'yyyy-mm-dd'格式的原始日期。
示例 -
<%= f.text_field :date, :class => "datepicker", :value => @model.date.strftime("%d %m %Y") %>
答案 1 :(得分:1)
解决:我按照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 %>
答案 2 :(得分:0)
如果您使用的是mysql数据库,则可以在查询本身中格式化日期。
示例代码
date_format(date_field,"%d %m %y")
答案 3 :(得分:0)
我最终做的是创建一个普通的文本输入并使用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 = $('<input type="hidden"></input>')
.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) }
}
这似乎可以使所有内容保持同步,将正确的日期格式发送给应用程序,并且会像任何人期望的那样降级。