rails检查完成date_select和time_select参数

时间:2013-03-17 01:23:25

标签: ruby-on-rails

我有一个更新表单,我希望用户更新日期。日期应始终比当前数据库中的日期更新,因此我希望我的脚本在用户点击提交按钮后验证它。 我走到这一步:

<%= 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)]
....

但由于某些原因,我在提交表单后无法访问完整的参数[: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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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