続・フォームと確認ページ

http://d.hatena.ne.jp/LukeSilvia/20070921/1190418225の続編

前の日記では、確認ページを作成するのにセッションを使った。
しかし、ずっと簡単かつ堅実な方法があった。


それは、HIDDENを使うというものである。
作戦としては、確認ページから「修正」や「決定」を選択するときに、内容を
HIDDENで送ってしまおうという作戦である。


題材はブログの日記作成としよう。

▼Controller

   def new
    @diary = Diary.new(params[:diary]) #hiddenが送られてこない場合は空になる
  end

  def edit_confirmation
    @diary = Diary.new(params[:diary])
    
    unless @diary.valid?
      render :action => "new"
    end
  
  end

  def create
    @diary = Diary.new(params[:diary])
    
    if @diary.valid?   #HIDDEN操作対策
      @user.diaries << @diary
      redirect_to :action => "result_edit_diary"
    else
      emergency_action("new") #HIDDEN操作は異常と判断
    end
    
  end

private

  def emergency_action(dest)
    flash[:notice] = "正常な操作が行なわれませんでした。"
    redirect_to :action => dest
  end

▼Model

  class Diary < ActiveRecord::Base
    belongs_to :user
  
    attr_protected :user_id
  
    MAX_TITLE_LENGTH = 100
    MAX_CONTENT_LENGTH = 500

    validates_presence_of :title,:content
    validates_length_of :title, :maximum => 100,:too_long => "が文字数制限を超えています。"
    validates_length_of :content, :maximum => 500,:too_long => "が文字数制限を超えています。"
  end


▼View(edit_confirmation.rhtml)

  <p>■タイトル<br />
   <%=h @diary.title%>
 </p>


 <p>■内容<br />
   <%=h @diary.content %>
 </p>

 <% form_tag :action => "create" do-%>
   <%= hidden_field :diary, :title, :value => @diary.title %>
   <%= hidden_field :diary, :content, :value => @diary.content %>
   <%= submit_tag("登録する")  %>
 <% end -%>

 <% form_tag :action => "new" do-%>
   <%= hidden_field :diary, :title, :value => @diary.title %>
   <%= hidden_field :diary, :content, :value => @diary.content %>
   <%= submit_tag("修正する")  %>
 <% end -%>


セッションの時と違って、確認画面のエンジンをViewの機能(HIDDEN)で担っているので、
テストも通常のC(RUD)の時と殆ど変わらなくなる。
絶対にこの方法がいい。