URL パラメータの一部を遷移先に引き継ぐ

Pocket

こんにちは、鈴木です。

こんなコードを書いてみました。

よくある商品検索ページを想像していただきたいのですが、「財布」で検索して(いま財布が欲しいんです)、商品一覧が表示されました。

検索にヒットした商品が多いので、商品一覧はページングされています。

794 ページでやっと良さそうな商品を発見したのでクリックして詳細ページを確認します。

他の商品も見たいので「一覧に戻る」リンクを押したら商品一覧の 1 ページに戻ってしまった。

本当は 794 ページを表示していたあの頃に戻りたかったのに、ということがあると思います。

794 ページを表示していたあの頃に戻りたい

おそらく View は以下のように実装されているのかと思います。

表示するページ番号が /items?page=794 のように指定されるとすると、以下のように params[:page] をリンク先に引き継いであげる必要があります。

これで詳細ページから一覧ページに戻ったときに、以前見ていた794ページが表示されるようになります。

とはいえ、急激に面倒くさくなった感があります。

メソッドに切り出してみる

そこで冒頭で紹介した take_params というメソッドです。

take_params を使うと、次のように書くことができます。

メソッドにしただけじゃないか、と思われるかもしれませんが、メソッドにしているからこそ変更に強くなります。

例えば、「ページあたりの表示件数 (params[:per_page]) もパラメータで指定されるんだった!」と後から気付いたとします。

そのときは、take_params を以下のように修正するだけで済みます。

「検索条件 (params[:search]) もパラメータで指定されるんだった!」というときは、こうなります。

メソッドに切り出したことで、変更があっても簡単に対応出来ました。

まとめ

冒頭で紹介した take_params はぱっと見て分かりやすくするためにシンプルな作りにしました。

このままでは若干機能不足ですので、もう少し改良を行いました。

最終的には、take_params 自体を改良し、フォーム(POST)で画面遷移する場合も考慮して take_params_hidden_field_tags というメソッドも作成しました。

take_params は ApplicationController で定義し、View でも使えるように「helper_method :take_params」としています。

デフォルトで引き継ぐパラメータは default_take_param_keys メソッドに分けました(オーバーライドして変更できるようにするためです)。

また、take_params メソッドは、引き継ぐパラメータの名前を明示的に指定することや、追加のパラメータを指定できるように改良しました。

take_params_hidden_field_tags はフォーム(POST)で画面遷移する場合に使用するメソッドで、ApplicationHelper に定義しました。

take_params_hidden_field_tags は take_params の戻り値を単純に <input type="hidden" ... /> に変換します。

使い方は以下のようになります。

ベストなやり方かどうかは分かりませんが、このような方法もある、ということをお伝えしました。

Enjoy Rails!

Pocket

Comments are closed, but you can leave a trackback: Trackback URL.