0

我有一个更新表单,我希望用户在其中更新日期。日期应该总是比数据库中当前的日期更新,所以我希望我的脚本在用户点击提交按钮后验证它。我已经走到了这一步:

<%= simple_form_for(calendar, :html => { :method => :put, :name => 'extend_link' }) do |f| %>

<p>Select the new date (must be newer than the current date): <%= f.date_select :end_at %> at <%= f.time_select :end_at, { :ignore_date => true } %></p>

<% end %>

标准更新放在我的控制器中,更新日历模型

  def update
    @calendar = current_user.calendar.find(params[:id])

      respond_to do |format|
        if @calendar.update_attributes(params[:calendar])
          format.html { redirect_to calendar_path, notice: 'The end date was extended.' }
          format.json { head :no_content }
        end
      end

  end

我在表单呈现后检查了源以了解日期和时间选择的工作原理,并且经过大量研究后,很明显日期在“合并”到我的模型和 end_at 之前被分成不同的部分柱子

calendar[end_at(3i)]
calendar[end_at(2i)]
....

但由于某种原因,提交表单后我无法访问完整的 params[:end_at]。但是,它必须是可访问的,否则模型怎么会被更新成一个整体呢?我疯了。

这很容易:

if params[:end_at] < @calendar.end_at
 puts "The new ending date is not after the current ending date."
else
 @calendar.update_attributes(params[:calendar])
end

为什么它不起作用以及如何解决我的问题?

谢谢你的帮助。

4

1 回答 1

0

可以在控制器中执行此操作,但听起来这是一个模型验证,所以我把它放在那里。使用ActiveModel::Dirty的魔力来查找之前和之后的属性,可能是这样的:

class Calendar < ActiveRecord::base

  validate :date_moved_to_future

  private

  def date_moved_to_future
     self.errors.add(:end_at, "must be after the current end at") if self.end_at_changed? && self.end_at_was < self.end_at
  end
end
于 2013-03-17T03:16:15.877 回答