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 に答える