启动日期picker的形式不保存到SQL数据库



抱歉,如果这是一个骗局-我找了答案彻底,找不到任何合适的。(

我很确定问题是我的表start_date和end_date字段是日期时间格式,而datepicker是保存为字符串-但我无法找出解决这个问题的方法。

这是我的约会。咖啡脚本:

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

我的/app/views/预约/_form.html。动词看起来像这样:

      <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]
08/31/2015任命(笔记)
约[start_date]08/23/2015约[user_id]
1

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

想法?谢谢!

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

EDIT 2:事实证明,如果日期是任何一个月的1号到12号,它将保存。如果是在13号到30号/31号之间,则不会保存

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

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

EDIT关于解决方案的更多细节:

您可以通过将format选项传递到appointments.coffee文件中初始化的Datepicker来在前端修复此问题,如文档所示:

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

注意日期在月份之前。这将以Rails能够理解并在保存时正确转换的方式格式化日期字符串。这可能是最干净的修复,但如果这不是您希望用户看到的日期方式,则会出现问题。

如果您确实希望为您的用户保留mm/dd/yyyy格式,则必须在表单提交给服务器之前或在Rails拥有提交的表单数据之后(但在它尝试使用日期字符串之前,因为,正如我们所建立的那样,它们将无效)对字符串值进行一些处理。这两种方法都有点粗糙。我可能会在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中添加{format: "dd-mm-yy"}来解决这个问题。还有一些格式问题,但是…

所以我说着:strftime("% m/% d/Y %"),我认为。

最新更新