2007年7月26日木曜日

Form結果のpagenate

以前このブログにpagenateをまとめたが、その後ちょっと問題が
あることが解りました。

<状況>
複数のフォームを持つトップページを作り、1コントローラーにて
複数のメソッドにて受付を行なう。
結果表示はlistのテンプレートを利用しレンダリングさせる。

<問題点>
ユーザー入力なしのpagenateの場合はGETの引数にpageというのがあれば
そのページが表示されて終わりでいいのですが、
Formからの入力後のpagenateの場合、ユーザー入力を引き継ぎつつ
次ページへのリンクを作る必要があります。
以前は
<%= link_to_unless(params[:page].to_i == page.number, page.number, {:params => params.merge('page' => page)}) %>
としていました。
問題は「params.merge」です。
この実行結果に、text_field( :theme, :title) として作られた入力の結果が流れると
theme=title入力
というようにmergeされます。
正しくは「theme[title]=入力」とならないと、メソッドで正常に受け取りが出来ないです。

<解決策>
かっこいい方法が思いつかなかったので、とりあえず下記のように逃げました。

controller
@link_hash = {'theme[title]' => params[:theme][:title]}

View
params.mergeを@link_hash.mergeにする。

もしユーザー入力が無かったという状態も引き継ぐとなるとGETには
theme[title]=
となって欲しいです。
しかし、これは入力が無いためにparamsではnilになります。
そこでcontroller冒頭にて
params[:theme][:title] = "" if params[:theme][:title] == nil
として無理やりnilを回避しました。

ちょっとかっこよく無いのですが、良い案が思いつかないので
とりあえずこれで回避です。

0 件のコメント: