三蔵開発メモ

Web開発やインフラ関連のメモを共有します

Railsでransackを使った検索を実装した時、検索結果をupdate後も保持するためにしたこと

ransackというgemを利用すると以下のように簡単に検索が実装できる。 こちらの記事がとても参考になった。

Ransackで簡単に検索フォームを作る73のレシピ - 猫Rails

ただindex内でupdateを呼んで更新をかけて、またindexにリダイレクトするような処理をしたかったのだが、 その場合検索結果が保持されないため、以下のように保持されるように処理を作った。

users_controller.rb

def index
  @search_param = User.ransack(params[:q])
  @users = @search_param.result()
  # 検索パラメータを保持
  if params[:q].present?
    @q = params[:q].permit!
  end
end

def update
 # update処理省略
 # 検索パラメーターがなかった場合permit!処理を行うとエラーになるため以下の分岐をさせる
  redirect_to users_path({q: params[:q].present? ? params[:q].permit! : params[:q] })
end

index.html.erb

<!-- 中略 -->
<%= link_to '更新', users_path(user, params: { q: @q}), method: :put %>
<!-- 中略 -->

ransackを使って検索を実装すると、params[:q]というパラメーターが入ってくるので、 そのパラメーターを保持してまずviewに渡し、そのパラメーターをupdateまでさらに渡す。

updateで処理終了後indexにredirectさせるときにそのurlパラメーターにparams[:q]をつけてあげれば良い。