Rails 保存 DateTimePicker 表单字段时反转日期和月份
Rails reverses day and month when saving DateTimePicker form field
我正在尝试在 Rails 5.2 应用程序的 Ruby 上以表格形式使用 Tempus Dominus Bootstrap 4,以便用户可以 select 约会。这是代码:
app/views/events/_form.html.erb
<div class='form-group'>
<%= f.label :starts_at, 'Start Date and Time', class: 'control-label' %>
<div class="input-group date" id="datetimepicker1" data-target-input="nearest">
<%= f.text_field(:starts_at, class: "form-control datetimepicker-input", data: {target:"#datetimepicker1"}) %>
<div class="input-group-append" data-target="#datetimepicker1" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fas fa-calendar-plus"></i></div>
</div>
</div>
</div>
app/assets/javascripts/events.js
$(function () {
$('#datetimepicker1').datetimepicker();
});
app/controllers/events_controller.rb
def create
@event = Event.new(event_params)
@event.user = current_user
if @event.save
redirect_to @event, notice: 'Event was successfully created.'
else
render :new
end
end
我想提交月份在前的格式。当我选择一个日期 2018 年 6 月 9 日并提交表格时,它会将其保存到数据库中,并将月份和日期颠倒过来:2018 年 9 月 6 日。当我在提交表格后查看 params
时,格式06/09/2018 6:00 PM
以月为先,但 Ruby/Rails 将其转换为日期时间对象,假定日为先。
如何告诉 Ruby 在将月份转换为日期对象时月份在前?我可以在保存之前在控制器中做一些事情吗?
你可以告诉Ruby如何读取时间字符串:
DateTime.strptime('06/09/2018', '%m/%d/%Y')
您可以在此 answer 中查看更多详细信息。
已编辑:
此外,您可以将默认日期格式设置为 there:
将此添加到 config/initializers/date_time.rb
Date::DATE_FORMATS[:default] = "%m/%d/%Y"
我发现您可以将日期格式更改为 Ruby 用户可以正确理解且易于阅读的格式。将 JavaScript 更改为:
$(document).on('turbolinks:load', function() {
$('#datetimepicker1').datetimepicker(
'format', 'MMMM D, YYYY h:mm A'
);
});
这将向用户显示日期为 2018 年 6 月 9 日 6:30 下午。日期格式来自 Moment.js http://momentjs.com/docs/#/displaying/format/ 但添加到 Tempus Dominus 的格式选项中。
附带说明一下,要让 tempus dominus boostrap 4 在 Rails 中工作,您还必须加载 moment.js。调用 cdn 或添加 momentjs-rails gem。如果是后者,那么在你的 application.js 文件中你需要要求它,像这样:
# app/assets/javascripts/application.js
...
//= require moment
//= require tempusdominus-bootstrap-4.js
我正在尝试在 Rails 5.2 应用程序的 Ruby 上以表格形式使用 Tempus Dominus Bootstrap 4,以便用户可以 select 约会。这是代码:
app/views/events/_form.html.erb
<div class='form-group'>
<%= f.label :starts_at, 'Start Date and Time', class: 'control-label' %>
<div class="input-group date" id="datetimepicker1" data-target-input="nearest">
<%= f.text_field(:starts_at, class: "form-control datetimepicker-input", data: {target:"#datetimepicker1"}) %>
<div class="input-group-append" data-target="#datetimepicker1" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fas fa-calendar-plus"></i></div>
</div>
</div>
</div>
app/assets/javascripts/events.js
$(function () {
$('#datetimepicker1').datetimepicker();
});
app/controllers/events_controller.rb
def create
@event = Event.new(event_params)
@event.user = current_user
if @event.save
redirect_to @event, notice: 'Event was successfully created.'
else
render :new
end
end
我想提交月份在前的格式。当我选择一个日期 2018 年 6 月 9 日并提交表格时,它会将其保存到数据库中,并将月份和日期颠倒过来:2018 年 9 月 6 日。当我在提交表格后查看 params
时,格式06/09/2018 6:00 PM
以月为先,但 Ruby/Rails 将其转换为日期时间对象,假定日为先。
如何告诉 Ruby 在将月份转换为日期对象时月份在前?我可以在保存之前在控制器中做一些事情吗?
你可以告诉Ruby如何读取时间字符串:
DateTime.strptime('06/09/2018', '%m/%d/%Y')
您可以在此 answer 中查看更多详细信息。
已编辑:
此外,您可以将默认日期格式设置为 there:
将此添加到 config/initializers/date_time.rb
Date::DATE_FORMATS[:default] = "%m/%d/%Y"
我发现您可以将日期格式更改为 Ruby 用户可以正确理解且易于阅读的格式。将 JavaScript 更改为:
$(document).on('turbolinks:load', function() {
$('#datetimepicker1').datetimepicker(
'format', 'MMMM D, YYYY h:mm A'
);
});
这将向用户显示日期为 2018 年 6 月 9 日 6:30 下午。日期格式来自 Moment.js http://momentjs.com/docs/#/displaying/format/ 但添加到 Tempus Dominus 的格式选项中。
附带说明一下,要让 tempus dominus boostrap 4 在 Rails 中工作,您还必须加载 moment.js。调用 cdn 或添加 momentjs-rails gem。如果是后者,那么在你的 application.js 文件中你需要要求它,像这样:
# app/assets/javascripts/application.js
...
//= require moment
//= require tempusdominus-bootstrap-4.js