Rails - 表单中的Bootstrap Datepicker没有保存到SQL db

时间:2015-08-23 05:43:40

标签: jquery ruby-on-rails twitter-bootstrap datepicker

对不起,如果这是一个骗局 - 我彻底找到了答案,但找不到合适的东西。 :(

我非常确定问题是我的表start_date和end_date字段是日期时间格式,而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 约会[END_DATE]
2015年8月31日 约会[注意事项]
约会[起始日期] 2015年8月23日 约会[USER_ID]
1

另一个注意事项:当我第一次实现它时,这有效,但是当我修复了turbolinks问题(将// = require jquery.turbolinks添加到application.js)时,它停止了保存到数据库(我认为)。

想法?谢谢!

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

编辑2 :事实证明,如果日期是任何月份的第1天到第12天,它将会保存。如果是在该月的13日至30日/ 31日之间,则不会保存。

2 个答案:

答案 0 :(得分:3)

Rails会尝试将字符串转换为保存到数据库之前的日期,但出于某种原因&#39; mm / dd / yyyy&#39;不是执行转换时所期望的格式之一(请参阅一些稀疏文档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

(我有点生疏,所以可能无法完全按照书面形式工作)

答案 1 :(得分:0)

我能够通过在我的JQuery中添加{format:“dd-mm-yy”}来解决问题。尽管还有一些形成问题......

所以我将.try(:strftime,“%m /%d /%Y”)添加到我的视图中。