複合条件でリスト表示をキープする。

フリーワード検索を追加する。

タイトル列、メモ列をフリーワードで検索できる検索フィールドを追加した。図で見るとこんな感じだ。

ビューに検索フィールドを追加するのは簡単だが、悩み事が一つ。

まず、現状のリスト表示の機能を整理してみると...
    • タイトル列をクリックすると、その列をキーにリスト全体を並び替える。
    • 同じタイトル列を続けてクリックすると、昇順と降順を切り替える。
    • キーワードのリンクをクリックすると、クリックしたキーワードでフィルタリングされる。
    • もう一度キーワードをクリックすると、フィルターは解除される。
さらに、フリーワード検索の機能は...
    • タイトル列、メモ列に対して、フリーワードによる検索を可能にする。


そうすると、並び替え、フィルター、検索の機能が利用できるのだが、この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

コントローラーで上記のようにパラメーターを受け取れば、値だけがビューと、コントローラーの間を往復して、保持されることになる。