#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 и т.д.