gpt4 book ai didi

jquery - Rails - 表单中的 Bootstrap Datepicker 不保存到 SQL 数据库

转载 作者:行者123 更新时间:2023-12-01 03:36:40 25 4
gpt4 key购买 nike

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

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

这是我的约会.coffee 脚本:

    `$(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问题(将//= require jquery.turbolinks 添加到 application.js )时,它停止保存到数据库(我认为)。

想法?谢谢!

编辑:在日期选择器中选择 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 端的某个地方执行此操作是否更有意义取决于您。

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

您可以通过在 appointments.coffee 文件中向 Datepicker 的初始化传递一个 format 选项来在前端修复此问题,如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com