リスト5はContactsControllerクラスに追加するsearchメソッドです。
リスト5:searchアクション
def search
@contact_pages, @contacts = paginate :contacts, :per_page => 10,
 :conditions => ["name LIKE ?", params[:contact][:name] + '%' ]
@keyword = params[:contact][:name]
render :action => 'list'
end
searchメソッドは短いメソッドではありますが、3つの重要なファクターが使われています。
- params
- フォームからの入力値は、paramsというハッシュオブジェクトに格納されます。リスト5では入力された検索キーワードをparamsから取得し、paginateの検索条件に使用しています
- render
- アクション名と同名のビューが表示されることはすでに説明しましたが、「render :action =>'アクション名'」を記述すると、指定したアクションで使われているビューが表示されます。今回の例では、「app/views/contacts/list.rhtml(一覧表示画面)」が表示されることになります
- paginate
- Webアプリケーションでは、件数の多い項目を複数のページに分割して、「次のページへ」「前のページへ」とリンクを表示することがよくあります。paginateはこのページ分割を簡単に実現できます
表2:searchメソッドの3つの重要なファクター
paginateの基本的な使い方は、第1引数にモデルを指定し、第2引数に1ページあたりの表示件数を指定することによって、ビューに「次のページへ」「前のページへ」のリンクを作成することができます(paginateの第3引数以降には、オプションで検索条件などを指定することもできます)。
今回実装したsearchアクションに対応するpaginateのビューは、Scaffoldによって生成されたlist.rthmlの実装(リスト6)をそのまま使用するため、実装の必要はありません。
リスト6:paginateを使ったビュー
<%= link_to 'Previous page', { :page => @contact_pages.current.previous } if @contact_pages.current.previous %>
<%= link_to 'Next page', { :page => @contact_pages.current.next } if @contact_pages.current.next %>
以上で検索機能の実装が完了しました。たったこれだけのコードでページ管理が実現できるRailsの生産性には驚かされます。
|