複合条件でリスト表示をキープする。
フリーワード検索を追加する。
タイトル列、メモ列をフリーワードで検索できる検索フィールドを追加した。図で見るとこんな感じだ。
ビューに検索フィールドを追加するのは簡単だが、悩み事が一つ。
まず、現状のリスト表示の機能を整理してみると...
-
- タイトル列をクリックすると、その列をキーにリスト全体を並び替える。
- 同じタイトル列を続けてクリックすると、昇順と降順を切り替える。
- キーワードのリンクをクリックすると、クリックしたキーワードでフィルタリングされる。
- もう一度キーワードをクリックすると、フィルターは解除される。
さらに、フリーワード検索の機能は...
-
- タイトル列、メモ列に対して、フリーワードによる検索を可能にする。
そうすると、並び替え、フィルター、検索の機能が利用できるのだが、この3つの機能を複合的に組み合わせて使えるようにしたい。現在も、並び替えとキーワードのフィルタリングは組み合わせて使えるようになっているが、完全とは言えない。前ページや次ページに移動すると、条件がクリアされてしまうのだ...。
link_to_remoteでやってみる。
リスト表示の条件を複合的に組み合わせるためには、一度セットした条件を保持する必要がある。いろいろな方法が考えられるが、今回は link_to_remote を使って、フォームのパラメータの受け渡しでやってみた。ちなみに、今までは flash に必要な値を保存する方法をとっていた。その他に session を使う方法も考えられる。まだ試していないが、この session を使う方法が、いちばん簡単で制御し易いのかもしれない。(最近、Ajaxづいていたので、今回は link_to_remote を使ってみたかったのだ。)
フォームによる条件の維持
- リスト表示の条件を保持するためのフォーム、_list_form.rhtmlを作成する。
- _list_form.rhtmlを使って、コントローラーとビューの間で常にパラメーターをやり取りすることで、条件を保持する。
- フォームを送信するためには、今までは以下のようにしていた。
<%= start_form_tag :action => 'save' %> <%= text_field_tag 'data', @value %> <%= submit_tag "Save" %> <%= end_form_tag %>
- これだと、フォームを送信するためには、submit_tagで生成される「Save」ボタンを押す必要がある。
- 今回は、列タイトルやキーワードのリンクをクリックした時にも、フォームを送信したい。
ink_to_remoteの使い方
- まず、フォームを<div>タグで囲って、id を submit_area に設定しておく。
<div id="submit_area"> <%= start_form_tag :action => 'save' %> <%= text_field_tag 'data', @value %> <%= submit_tag "Save" %> <%= end_form_tag %> </div>
- link_to_memoteで以下のように呼び出す。
<%= link_to_remote 'save_remote', :update => 'update_area', :submit => 'submit_area', :url => {:action => 'save'} %>
- link_to_remoteで生成される「save_remote」リンクをクリックすると...
- コントローラーのsaveメソッドが実行される。
- その際、submit_area内のフォームに設定された値が、パラメーターとして渡される。
- update_areaを部分的に再描画する。
- このlink_to_remoteを列タイトルやキーワードに利用すれば、submit_area内のフォームがパラメーターとしてコントローラーへ送信される。
- コントローラーではparams[:data]で値を取得して、その値を変数@valueに設定して、再び _list_form.rhtml を描画する。
- このようにビューと、コントローラーの間を、設定値が往復し続けることになる。この動作によって、必要な値を保持している。
- もし、「Save」ボタンが不要で、値の保持だけで表示や入力も不要なら、シンプルに以下のように書くことができる。
<div id="submit_area"> <%= hidden_field_tag 'data', @value %> </div>
<%= link_to_remote 'save_remote', :update => 'update_area', :submit => 'submit_area', :url => {:action => 'save'} %>
これで、webブラウザの見た目上は何も表示されない。(ソースとしては送信されている。)
def save @value = params[:data] ...(処理)... end
コントローラーで上記のようにパラメーターを受け取れば、値だけがビューと、コントローラーの間を往復して、保持されることになる。