抱歉,这是骗子-我已在寻找答案,找不到合适的答案。 :(
我很确定问题出在我的表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/