Hatena::Groupxiss

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

カテゴリー
 | 

2008-10-02

flash が消えてくれない問題

| 00:51 |  flash が消えてくれない問題 - ハイジ @ キッス を含むブックマーク はてなブックマーク -  flash が消えてくれない問題 - ハイジ @ キッス  flash が消えてくれない問題 - ハイジ @ キッス のブックマークコメント

flashAdobe のやつじゃなくて flash[:hoge] とかで内容を一画面移動表示してくれるやつ. リダイレクトしたときとかに便利だよね.


flash が表示された状態で同じページに遷移したときに 消えてくれるはずの flash が消えてくれない.


仕方ないので

flash.discard

として強制的に flash が保持している内容を削除した.

参考

404 Not Found


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

| 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>

こんな感じ.

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

ゲスト



トラックバック - http://xiss.g.hatena.ne.jp/higeorange/20081002
 |