关于ruby:当保存DateTimePicker表单字段时,Rails会反转日期和月份

Rails reverses day and month when saving DateTimePicker form field

我正在尝试在RubyonRails5.2应用程序上以RubyonRails5.2的形式使用tempusDomiusBootstrap4,这样用户就可以选择一个日期。代码如下:

应用程序/视图/事件/u form.html.erb

1
2
3
4
5
  <%= f.label :starts_at, 'Start Date and Time', class: 'control-label' %>
 
    <%= f.text_field(:starts_at, class:"form-control datetimepicker-input", data: {target:"#datetimepicker1"}) %>
   
      <i class="fas fa-calendar-plus">

应用程序/资产/javascripts/events.js

1
2
3
$(function () {
  $('#datetimepicker1').datetimepicker();
});

应用程序/控制器/事件控制器.rb

1
2
3
4
5
6
7
8
9
  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和month first,但ruby/rails将其转换为假定day first的datetime对象。

如何告诉Ruby在将月份转换为日期对象时,月份是第一个?在保存之前,我可以在控制器中做些什么吗?


您可以告诉Ruby如何读取时间字符串:

1
DateTime.strptime('06/09/2018', '%m/%d/%Y')

你可以在这个答案中看到更多的细节。

编辑:

此外,还可以在此处设置默认日期格式:

将此添加到config/initializers/date_time.rb

1
Date::DATE_FORMATS[:default] ="%m/%d/%Y"


我发现您可以将日期格式更改为一个Ruby正确理解的格式,并且用户很容易阅读。将javascript更改为:

1
2
3
4
5
$(document).on('turbolinks:load', function() {
  $('#datetimepicker1').datetimepicker(
    'format', 'MMMM D, YYYY h:mm A'
  );
});

这将向用户显示日期为2018年6月9日下午6:30。日期格式来自moment.js http://moment js.com/docs//displaying/format/,但添加到tempus dominus的格式选项中。

附带说明,要让tempus dominus boostrap 4在rails中工作,还必须加载moment.js。要么调用cdn,要么添加momentjs rails gem。如果后者出现在application.js文件中,则需要它,如下所示:

1
2
3
4
# app/assets/javascripts/application.js
...
//= require moment
//= require tempusdominus-bootstrap-4.js