Аргумент вне диапазона Rails 4 и bootstrap3-datetimepicker-rails

Я использую bootstrap3-datetimepicker-rails gem, чтобы пользователи сохраняли scheduled_date WorkOrder в моем приложении (a ' DateTime '), но я получаю ошибку argument out of range, когда пользователь отправляет форму для создания WorkOrder, а дата очень отличается от того, что было выбрано, когда пользователь открывает экран редактирования. Самое забавное, что он работал, но я не знаю, какой код мог измениться, чтобы сломать его.

Я добавил необходимые зависимости и включил правильные директивы в свои файлы CSS/JS:

gem 'momentjs-rails', '~> 2.5.0'
gem 'bootstrap3-datetimepicker-rails', '~> 3.0.0'

Насколько я могу судить, мой код похож на пример в документации. Вот фрагмент моей формы:

  <div class="row">
    <div class="col-md-4">
      <div class="form-group">
        <%= f.label :scheduled_date %>
        <div class='input-group date'>
          <span class="input-group-addon"><span class="fa fa-calendar"></span></span>
          <%= f.text_field :scheduled_date,  class: 'form-control input-lg', id: "service_date_picker" %>
        </div>
      </div>
    </div>
  </div>


  <script type="text/javascript">
      $(function () {
        $('#service_date_picker').datetimepicker({
          icons: {
            time: "fa fa-clock-o",
            date: "fa fa-calendar",
            up: "fa fa-arrow-up",
            down: "fa fa-arrow-down"
          }
        });
      });
  </script>

EDIT (забыл добавить код контроллера - очень просто):

work_orders_controller.rb

def create
  @work_order = WorkOrder.new(work_order_params)

  ... [it errors on the line above]
end

И мой белый список параметров:

def work_order_params
  params.require(:work_order).permit(:caller_name, :brief_job_details, :contract_price, :quoted_by, :job_description, :scheduled_date, :time_materials_details, :sheduled_time, :contact_name, :payment_method, :notes, :customer_id, :job_site_id)
end

И пример параметров, которые дают ошибку argument out of range при сохранении формы:

work_orders_attributes"=>{"0"=>{"caller_name"=>"Justin", "time_materials_details"=>"", "contract_price"=>"", "quoted_by"=>"", "payment_method"=>"", "job_description"=>"", "scheduled_date"=>"05/23/2014 1:28 PM", "notes"=>""}}

То же, что и my customers_controller.rb, где у меня есть вложенная форма для WorkOrder внутри новой клиентской формы (все остальное в этой форме работает отлично):

def create
  @customer = Customer.new(customer_params)

  ... [errors above]
end

Дата и время сохраняются правильно, если они находятся в течение 24 часов, но даже если они сохраняются правильно, дата отображается полностью странно и неформатируется в текстовом поле, когда я перехожу к редактированию этого WorkOrder. Например:

Когда я выбираю дату из выбора даты: 05/06/2014 10:28 AM

Когда я редактирую WorkOrder: 2014-06-05 10:28:00.000000

Любые идеи? Любые предпочтения в том, следует ли мне создать это поле a Date, Time или DateTime (в настоящее время)? Сейчас мы работаем в Центральном часовом поясе, но это не всегда так.

Спасибо заранее за то, что указали мне в правильном направлении!

Ответы

Ответ 1

@Ури Агасси прав: это значения, которые вы передаете, чтобы создать WorkOrder, которые наиболее актуальны здесь.

Попробуйте использовать параметры форматирования даты, предоставленные вам bootstrap-datepicker. Если вы можете получить формат, который выглядит хорошо и легко разобрать на сервере, то вы захотите перехватить этот параметр перед тем, как перейти к модели для проверки.

Независимо от того, что вы собираетесь использовать для форматирования даты на стороне клиента, вы все равно захотите проанализировать его на пригодной стороне сервера объектов Date или DateTime в вашем контроллере. Отъезд DateTime#strptime. Вы также можете вызвать #strptime на Date.

Непроверенный, но есть идея:

def create
  order_params = work_order_params
  order_params[:scheduled_date] = Date.strptime(order_params[:scheduled_date],
                                                '%m/%d/%Y %I:%M %p')
  @work_order = WorkOrder.new(order_params)
end

Ответ 2

Вы можете удалить изменения из контроллера вместе, обновив значения в модели. Я считаю, что это гораздо более чистый (и многоразовый) подход.

class Work < ActiveRecord::Base

  def scheduled_date=(date)
     begin
       parsed = Date.strptime(date,'%m/%d/%Y %I:%M %p')
       super parsed
     rescue
       date         
     end
  end

end

Ответ 3

Мне помогли:
Чтобы файл application.js записывался в конечный файл:

$(function() {
  $('.datepicker').datepicker({format: 'dd-mm-yyyy'});
});

Ответ 4

Этот плагин использует moment.js. В основном вам нужно выбрать желаемый формат времени.

Пример

$(function () {
 $('#datetimepicker').datetimepicker({format: 'MMMM Do YYYY, h:mm'});
});