抱歉,这是骗子-我已在寻找答案,找不到合适的答案。 :(

我很确定问题出在我的表start_date和end_date字段是datetime格式,并且datepicker保存为字符串-但我想不出一种解决办法。

这是我的约会脚本:

    `$(document).ready(function() {
       $('.datepicker')
        .datepicker()
        .on('changeDate', function(ev) {
          $(this).datepicker('hide');
       });
     });`


我的/app/views/appointments/_form.html.erb看起来像这样:

      <div id="drop-off">
          <%= f.label :Drop_off %><br>
          <%= f.text_field :start_date, :class => 'datepicker' %>
      </div>
      <div id="pick-up">
          <%= f.label :Pick_up %><br>
          <%= f.text_field :end_date, :class => 'datepicker' %>
      </div>


注意:数据正在传递到服务器,但日期未写入数据库。当我在Firebug中查看输出时,它看起来像这样:

方法
补丁
约会[bird_id]
1个
约会[cage_needed]
0
预约[签到]
0
约会[customer_id]
1个
约会[结束日期]
2015年8月31日
约会[笔记]
约会[开始日期]
2015年8月23日
约会[user_id]
1个

另一个需要注意的是:这在我第一次实现它时就起作用了,但是当我解决了turbolinks问题(向application.js添加// =需要jquery.turbolinks)时,它停止了保存到数据库中(我认为)。

有想法吗?谢谢!

编辑:在datepicker中选择2015年8月12日之前的日期将保存到数据库,但是此后的任何内容都不会保存。

编辑2:事实是,如果日期是任何月份的1日到12日,它将保存。如果介于每月的13日和30日/ 31日之间,则不会保存。

最佳答案

Rails会尝试在保存到数据库之前将字符串转换为日期,但是出于某种原因,“ mm / dd / yyyy”不是执行转换时期望的格式之一(请参见稀疏文档here)。因此,如果打开Rails控制台并尝试执行'8/13/2015'.to_date之类的操作,则会收到无效的日期错误,可能是因为它将13解释为月份而不是日期。但是,如果您没有对模型进行验证以确保该日期存在,Rails会很高兴使用nil日期将模型持久保存到数据库中。

因此,解决方案似乎是将日期格式更改为一个Rails不会抱怨的格式。在JavaScript端还是在Rails端执行此操作更有意义,这取决于您。

编辑该解决方案的更多详细信息:

您可以通过在format文件中将appointments.coffee选项传递给Datepicker的初始化作为documented来解决此问题。

$(document).ready(function() {
   $('.datepicker')
    .datepicker({ format: 'dd/mm/yyyy' })
    .on('changeDate', function(ev) {
      $(this).datepicker('hide');
   });
 });


请注意,日期在月份之前。这将以Rails理解的方式格式化日期字符串,并且在保存时可以正确转换日期字符串。这可能是最干净的修复程序,但是如果这不是您希望日期显示给用户的方式,那将是一个问题。

如果您确实想为用户保留mm / dd / yyyy格式,则必须在将表单提交到服务器之前或在Rails提交提交的表单数据之后(但在此之前)对字符串值进行一些处理。尝试使用日期字符串,因为正如我们已经确定的那样,它们将无效)。两种方法都将是一种hacky。我可能会在AppointmentsController内使用before_action来修改params哈希,以便日期字符串采用正确的格式:

before_action :process_dates, only: [:create, :update]

def process_dates
  [:start_date, :end_date].each do |d|
    # assuming 'mm/dd/yyyy' format
    date = params[:appointment][d]
    date_parts = date.split('/')
    # swap date and month
    date_parts[0], date_parts[1] = date_parts[1], date_parts[0]
    params[:appointment][d] = date_parts.join('/')
  end
end


(我有点生锈,所以可能无法完全按照书面要求工作)

关于jquery - Rails-表单中的Bootstrap Datepicker未保存到SQL数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32163578/

10-12 00:10
查看更多