絞り込み検索 ransackその2 完全に日記

前回ransackに初めて触れた時にしてためちゃダサい部分の修正

homeにそのまま@result出しても良いけどsearchアクション動いた後だからsearch.html.hamlに結果表示するのが妥当だろう。

 

前回は学習中だったので検索ページを2つ作る見たいな無駄なことをしてた。意味ないので結果はsearch.html.hamlに集約した。

 

まず最初の検索結果はransackのインスタンスと区別した。@firstimagesのような形でそれが検索の結果空でなければ表示し、そうでなければ(else)、ransackの@resultを表示するような形にした。ransack側の処理で特に[:q]に何も入ってなければ全部itemいれるようにしてたので最初の検索の結果があればそれを表示し、ページ遷移後は検索のparamsは空になるのでelse側でransackの@resultが表示されるようにした。

注意すべきなのは、モデルメソッドでparamsが空の場合に全てitemを入れるような処理を書いていた場合は外すこと。次のページのフォームでそのparamsが空になるので意図せず全部入れてしまって検索が効かなくなる。モデルの方でこの処理を書かなくても次のページのransackの処理の方で空なら全部入れる処理を書いておけば、意図した動きになる。

 

それとransackのフォームは常にparamsに[:q]が入ってるかをケアしないといけない。

何も検索フィールドに入ってない状態、つまり[:q]がnilの時は諸々のフォームのオプションなんかで不都合が起こる可能性があるので注意。価格や新旧で並び替えをする時に

f.select(:sorts{'表示する選択肢': '並び方指定。price ascとか'・・・繰り返し・・},

{selected:params[:q][:sorts]},{onchange: this.form.submit()})

とかで出来る感じだったけど最初[:q]に何も入ってないのでコントローラー側でparams[:q].present?とかで条件分岐して空の場合はid_descとかにしとく

参考記事見た方が早い

https://qiita.com/akkie/items/9d09d21a0e8ee47a1691