Rails меняет день и месяц при сохранении поля формы DateTimePicker - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь использовать Tempus Dominus Bootstrap 4 в форме в приложении Ruby on Rails 5.2, чтобы пользователь мог выбрать дату. Вот код:

приложение / просмотров / События / _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>

приложение / активы / JavaScripts / events.js

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

приложение / контроллеры / 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

Я хочу отправить формат с месяцем первым. Когда я выбираю дату 9 июня 2018 года и отправляю форму, она сохраняет ее в базе данных с обратным месяцем и днем: 6 сентября 2018. Когда я смотрю на params после отправки формы, формат 06/09/2018 6:00 PM с первым месяцем, но Ruby / Rails преобразует его в объект datetime, считая день первым.

Как мне сказать Ruby, что месяц является первым при преобразовании его в объект даты? Можно ли что-то сделать в контроллере перед сохранением?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я обнаружил, что вы можете изменить формат даты на тот, который Ruby правильно понимает, и который легко читается пользователями. Измените JavaScript на:

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

Это покажет пользователю дату 9 июня 2018 18:30. Формат даты происходит из Moment.js http://momentjs.com/docs/#/displaying/format/, но добавляется к опции формата Tempus Dominus.

В качестве примечания: для того, чтобы программа tempus dominus boostrap 4 работала в Rails, вам также необходимо загрузить moment.js. Либо позвоните в cdn, либо добавьте драгоценный камень momentjs-rails. Если последнее, то в вашем файле application.js вам это нужно, примерно так:

# app/assets/javascripts/application.js
...
//= require moment
//= require tempusdominus-bootstrap-4.js
0 голосов
/ 16 мая 2018

Вы можете сказать Ruby, как читать строку времени:

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

Подробнее вы можете увидеть в этом ответе .

Отредактировано:

Кроме того, вы можете установить формат даты по умолчанию как там :

Добавьте это в config / initializers / date_time.rb

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