■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)の時と殆ど変わらなくなる。
絶対にこの方法がいい。