Rails表单通过`datetime_select`保存错误的日期

时间:2016-10-22 17:53:50

标签: ruby-on-rails

我的应用程序表单的编辑视图令人困惑。在某些(但不是全部)实例中,保存在数据库中的event_date与放入表单上f.datetime_select字段的event_date不同。例如,如果我选择" 11月5日"并点击提交并检查我的控制台,edit读取" 11月11日"。我只与部分实例存在此问题,并且只有new视图(而不是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的{​​{1}}方法是这样的:

  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 个答案:

答案 0 :(得分:0)

计算下一个日期的月度方法:

...
ga('create', 'YOUR ID', 'auto');
ga('set', 'page', 'http://yourdomain/foo');
ga('set', 'title', 'New Title'); //optional to change title too!
ga('send', 'pageview');
...

引用when "Monthly" @schedule.add_recurrence_rule( IceCube::Rule.monthly.day_of_month(self.event_date.mon) ) 引用月份编号,而不是self.event_date.mon引用该月份的日期。因此,11月的事情被给予11日等等。