对不起,如果这是一个骗局 - 我彻底找到了答案,但找不到合适的东西。 :(
我非常确定问题是我的表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日之间,则不会保存。
答案 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”)添加到我的视图中。