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

时间:2011-11-12 08:11:37

标签: jquery jquery-ui ruby-on-rails-3.1

我的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时,它显示正确的格式,但表单助手仍然显示原始格式。

4 个答案:

答案 0 :(得分:11)

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

示例 -

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

更多示例@ Rails date format in a text_field

答案 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) }
}

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