Форма Rails сохраняет неправильную дату с помощью `datetime_select`

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня сложная ситуация с редактированием формы в моем приложении. В некоторых (но не во всех) случаях event_date сохраняемая в базе данных информация отличается от того, что вводится в f.datetime_select поле формы. Например, если я выберу «5 ноября» и нажму «Отправить» и проверю свою консоль, event_date будет указано «11 ноября». У меня эта проблема только с некоторыми экземплярами и только с edit представлением (не new view).

Мой код формы из my reminders#edit (который совпадает с моим reminders#new , для записи) выглядит следующим образом:

 <%= form_for @reminder do |f| %>

  <div class="row">
      <div class="field col-xs-7 col-xs-12">
        <%= f.label "Thing to Remember" %>
        <%= f.text_field :name, class: "form-control" %>
      </div>

      <div class="field col-sm-5 col-xs-12">
        <%= f.label "Date" %>
        <%= f.datetime_select :event_date, class: "form-control" %>
      </div>

      <div class="field manly-radios col-xs-6">
        <%= f.label "Repeat Event?" %><br>
        <%= f.radio_button :repeating, "None" %>
        <%= f.label :repeating, "No Repeat", value: "None"  %><br>
        <%= f.radio_button :repeating, "Weekly" %>
        <%= f.label :repeating, "Weekly", value: "Weekly"  %><br>
        <%= f.radio_button :repeating, "Monthly" %>
        <%= f.label :repeating, "Monthly", value: "Monthly"  %><br>
        <%= f.radio_button :repeating, "Yearly" %>
        <%= f.label :repeating, "Yearly", value: "Yearly"  %><br>
      </div>

      <div class="field col-xs-6">
        <%= f.check_box :gift %>
        <%= f.label "Gift required" %><br>
        <%= f.check_box :gift_help %>
        <%= f.label "Help me find a gift" %><br>
        <%= f.check_box :reminder %>
        <%= f.label "Please remind me" %>
      </div>
    </div> <!-- row -->

    <div class="row text-center" style="padding-top: 25px">
      <%= f.submit "Remind Me", class: "hvr-grow btn btn-manly" %>
    </div>
  <% end %>
  

Мой reminders_controller.rb метод для edit такого:

   def edit
    @reminder = Reminder.find(params[:id])
    @reminder.save
    render layout: 'nofooter'
  end
  

С этими строгими параметрами:

 private

  def reminder_params
    params.require(:reminder).permit(:name, :user, :event_date, :mail_date, :occasion_type, :reminder, :repeating, :gift, :gift_help)
  end
  

И вот моя reminder.rb модель:

 class Reminder < ActiveRecord::Base
  belongs_to :user
  before_save :create_mail_date
  after_save :send_reminder_emails
  extend FriendlyId
  friendly_id :name, use: [:slugged, :finders]

  def create_mail_date
    @schedule = IceCube::Schedule.new(self.event_date)
    case self.repeating
    when "Weekly"
        @schedule.add_recurrence_rule(
            IceCube::Rule.weekly
        )
    when "Monthly"
        @schedule.add_recurrence_rule(
            IceCube::Rule.monthly.day_of_month(self.event_date.mon)
        )
    when "Yearly"
        @schedule.add_recurrence_rule(
            IceCube::Rule.yearly.day_of_year(self.event_date.yday)
        )
    end
    if self.repeating
        self.event_date = @schedule.next_occurrence(Time.current)
    end
    self.mail_date = self.event_date  - 7.days
  end

  private

  def send_reminder_emails
      if self.reminder
       RemainderMailerJob.set(wait_until: self.mail_date).perform_later(user, remainder)
         #ReminderMailer.delay(run_at: self.mail_date).reminder_send(self.user, self)
         self.create_mail_date
     end
  end
  handle_asynchronously :send_reminder_emails

end
  

Кто-нибудь может увидеть, что вызывает это странное поведение?

Комментарии:

1. вы пытались создать событие без повторения??

2. Все ли экземпляры присутствуют на одном сервере? Если экземпляры с неправильной датой находятся на другом сервере, мы можем проверить дату и время этого сервера.

3. @Bandi, ошибка возникает только при повторяющихся событиях. Из того, что я могу сказать, это происходит только при ежемесячных и ежегодных повторяющихся событиях.

Ответ №1:

Ежемесячный метод вычисления следующей даты:

 when "Monthly"
    @schedule.add_recurrence_rule(
        IceCube::Rule.monthly.day_of_month(self.event_date.mon)
    )
  

Ссылка, self.event_date.mon относящаяся к номеру месяца вместо self.event_date.day ссылки на день месяца. Поэтому вещам в ноябре был присвоен номер дня 11 и т.д.