【问题标题】:Rails reverses day and month when saving DateTimePicker form field保存 DateTimePicker 表单字段时,Rails 反转日期和月份
【发布时间】:2018-05-16 07:07:36
【问题描述】:

我正在尝试在 Ruby on Rails 5.2 应用程序上以表单形式使用 Tempus Dominus Bootstrap 4,以便用户可以选择日期。代码如下:

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 时,格式为 @ 987654325@ 月份在前,但 Ruby/Rails 将其转换为日期时间对象,假设日期在前。

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

【问题讨论】:

  • 你能控制日期时间选择器使用的格式吗?当您使用非模棱两可的 ISO8601 格式时,事情往往会变得更顺利。
  • 我认为是这样,但它不在基本文档中。涉及两个库的事实使情况变得复杂。处理日期格式的 Moment.js 和创建日期选择器的 Tempus Dominus Bootstrap 4。
  • 我想出了如何做到这一点并将其添加为单独的答案。

标签: ruby-on-rails ruby date tempus-dominus-datetimepicker


【解决方案1】:

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

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

您可以在此answer 中查看更多详细信息。

已编辑:

另外,您可以将默认日期格式设置为there

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

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

【讨论】:

  • 不幸的是我试过了,但由于某种原因它不起作用。它确实将其转换为这样,但仍以错误的格式将其保存到数据库中。
  • 好吧,我想通了。在使用您提到的 DateTime.strptime 函数进行转换之前,我必须从列入白名单的 event_params 中删除该字段。
  • 谢谢,我也试试初始化器。在控制器操作中,除了从 event_params 中删除字段外,我还必须添加到创建和更新操作:
  • @event.starts_at = DateTime.strptime(params['event']['starts_at'],'%m/%d/%Y %H:%M %p')
  • 到数据库,它以标准日期时间格式保存为:2018-09-06 18:00:00
【解决方案2】:

我发现您可以将日期格式更改为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多