Rails 3 jquery日期选择器日期未保存到数据库

时间:2011-08-24 19:35:27

标签: ruby-on-rails-3 jquery-ui-datepicker

当我提交表单时,我可以在帖子中看到发送日期。但是,它不保存日期。如果我做一个日期检查,它说它的格式不正确。这是我的日期选择器功能,它显示正常:

    $j(function(){
    $j("#mile_date").datepicker();
});

$ j是因为我也在使用原型,因此所有jquery调用都使用了noconflict变量。

这是帖子:

 Parameters: {"utf8"=>"Γ£ô", "authenticity_token"=>"Fj4HW/B4EOan/vcPZLJ75TvWkRH4ZKSFsPLlQLSD0cI=", "mile"=>{"odometer"=>"", "trip"=>"428.2
", "gallons"=>"24.959", "note"=>"", "temperature"=>"", "date"=>"06/22/2011"}, "commit"=>"Create Mile"}

所以它发送日期很好,但rails似乎不喜欢格式。它将空值插入数据库。如果我使用带有下拉列表的默认日期字段提交它,则会发送此信息并保存正常:

    Parameters: {"utf8"=>"Γ£ô", "authenticity_token"=>"Fj4HW/B4EOan/vcPZLJ75TvWkRH4ZKSFsPLlQLSD0cI=", "mile"=>{"odometer"=>"", "trip"=>"428.2
", "gallons"=>"24.959", "mpg"=>"17.156136063144", "note"=>"", "temperature"=>"", "date(1i)"=>"2011", "date(2i)"=>"6", "date(3i)"=>"22"}, "c
ommit"=>"Create Mile"}

在insert语句中,它将日期插入为:'2011-06-22'

Rails是否期望3个变量中的日期正确构造日期格式?如何让datepicker发送正确的日期格式?

提前谢谢你,

6 个答案:

答案 0 :(得分:37)

我遇到了同样的问题。一种解决方案是简单地更改datepicker使用的格式:

// in your javascript...
$j(function(){
  $j("#mile_date").datepicker({
    dateFormat: "yy-mm-dd"
  });
});

Rails似乎能够处理yy-mm-dd格式 - 我正在使用它并且没有将日期保存到数据库的问题。这里唯一的问题是有些人可能会发现yy-mm-dd格式看起来不像mm / dd / yyyy ......

答案 1 :(得分:20)

正如@BaronVonBraun所指出的,rails似乎没有处理这种格式。按照他的建议改变它。但是,对于那些想要与yy-mm-dd不同的格式的人,可以使用以下内容。当rails获得所需的格式时,用户会看到您想要的格式。

$j(function(){
    $j("#show_date").datepicker({altField: '#mile_date', altFormat: 'yy-mm-dd'});
});

show_date是他们看到的字段的id,而mile_date是一个隐藏字段,其中包含日期rails需要。

这是documentation

答案 2 :(得分:1)

如果有人使用jquery_datepicker gem,您将需要在rails视图中使用类似于以下代码的内容。

<%= form.hidden_field(:ship_date, :id => "ship_date") %>   
<%= datepicker_input(:show_date, item.id, :size => 10, altField: "#ship_date", altFormat: 'yy-mm-dd', :value => item.ship_date.strftime("%m/%d/%Y"))%>

您还可以使用form.datepicker_input将日期选择器直接附加到表单,但在我的用例中,我希望日期选择器能够反映Rails不接受的本地化日期。所以我添加了一个隐藏的表单元素并为其设置备用字段,完美运行!

答案 3 :(得分:0)

或尝试delocalize gem:https://github.com/clemens/delocalize

答案 4 :(得分:0)

j('.jquery-calendar').datepicker().each(function(){
  // convert dates from db to US format
  var $input = j(this)
  var found = $input.val().match(/^(\d{4})-(\d{2})-(\d{2})$/);
  if(found){
    $input.val(found[2]+'/'+found[3]+'/'+found[1]);
  }
});

答案 5 :(得分:0)

当我知道我以mm-dd-yy格式提供服务器日期时,有点hacky但直接帮助了设置事项

def convert_to_y_m_d(date)
  new_date = date.split("-")[2] + "-" + date.split("-")[0] + "-" + date.split("-")[1]
  new_date
end