##ユーザー検索
・全ユーザーを表示するページ(/users)上での、ユーザー名の検索と検索結果を表示する機能を付けたいとおもいます。
##gemをインストールする
・ユーザー検索をする際にRails用の検索機能を簡単に実装できる、Ransack Gemを使いたいと思います。
#gemファイルに追加してbundle install
gem 'ransack'
##実装
・ユーザーの検索用のフォームを作ります。
<%= search_form_for @q do |f| %>
<h1>ユーザー検索</h1>
<div class = "input-group">
<%= f.text_field :name_cont, placeholder: "ユーザーネームを入力" %>
<%= f.submit '検索' %>
</div
<% end %>
・「name:cont」を利用しています。
・今回の検索ではユーザー名(name)に検索ワードが含まれているか(cont、containのこと)を調べるため、「:name_cont」を指定しています。
・次にUsersContorollerのindexアクションに処理を加えたいと思います。
def index
if params[:q] && params[:q].reject { |key,value| value.blank? }.present?
@q = User.ransack(search_params, activated_true: true)
@title = "検索結果"
else
@q = User.ransack(activated_true: true)
@title = "全てのユーザー"
end
@users = @q.result.paginate(page: params[:page])
end
~省略~
private
def search_params
params.require(:q).permit(:name_cont)
end
・params[:q][:name_cont]にユーザーが指定した検索ワードが含まれている。検索ワードの指定がない場合は全アクティブユーザーを取得します。
・「モデル名.Ransack(検索条件)」の結果を「result」で取得、検索なしの時と検索ありの時でタイトルを変更しています。
・Viewに_search_form.html.erbを挿入します。(この部分は各自で違うと思いますが...。)
<% provide(:title,'ユーザー検索') %>
<h1><%= @title %></h1>
<div class="row">
<%= render 'users/search_form' %>
</div>
<%= will_paginate %>
<% unless @users.empty? %>
<ul class= "users">
<%= render @users %>
</ul>
<% else %>
<p>
ユーザーが見つかりませんでした。<br>
お探しのユーザー名を確認してください。
</p>
<% end %>
<%= will_paginate %>
・検索結果が0の時にはメッセージを表示するようにしました。
##最後
・以上になりますが、とりあえずできました。
・テストは次回やってみたいと思います。