Hatena::Groupxiss

ハイジ @ キッス このページをアンテナに追加 RSSフィード

カテゴリー
 | 

2008-10-02

レコードのバリデートエラーメッセージの問題

| 23:12 |  レコードのバリデートエラーメッセージの問題 - ハイジ @ キッス を含むブックマーク はてなブックマーク -  レコードのバリデートエラーメッセージの問題 - ハイジ @ キッス  レコードのバリデートエラーメッセージの問題 - ハイジ @ キッス のブックマークコメント

モデルで validates_presence_of などのメソッドでバリデートを定義しておくとそのモデルを保存するときに検証してくれる.

例:

def create
  ...
  ...
  if @hoge.save
  else
    #バリデートに通らなかった場合
    render :action => 'new'
  end
end

上の例のようなコントローラ定義だとバリデートに通らなかった場合, action: new のページが表示されて

<%= error_messages_for %>

がビューにあればそこにエラーメッセージが表示される.


動作としては問題ないんだけど, new のページ URL をルーティングで変更している場合 URL が気持ち悪いものになってしまう.

そこで render メソッドではなく redirect_to メソッドで綺麗な URL で "new" のページを表示させることにする.


がここで問題発生.

redirect_to で飛ばした new ページでは エラーの内容を保持してくれていないので

<%= error_messages_for %>

にエラーが表示されない.


解決策として

flash を使うことにした.

def create
  ...
  ...
  if @hoge.save
  else
    flash[:notice] = render_to_string :partial => "layouts/validates_error_messages", :locals => { :errors => @hoge.errors.full_messages }

    redirect_to "[new のアクションが呼ばれる URL]"
  end
end

エラーメッセージを綺麗に表示させるために render_to_string :partial を使う.


# app/view/layouts/_validates_error_messages.html.erb
<p><%= errors.size %>個のエラーがあります</p>
<ul>
<% errors.each do |error| -%>
  <li><%= error %></li>
<% end -%>
</ul>

こんな感じ.

これでエラーメッセージが表示できた.

 |