1
1

More than 3 years have passed since last update.

ユーザーを検索する機能を実装するの巻 その1

Last updated at Posted at 2021-04-24

ユーザー検索

・全ユーザーを表示するページ(/users)上での、ユーザー名の検索と検索結果を表示する機能を付けたいとおもいます。

gemをインストールする

・ユーザー検索をする際にRails用の検索機能を簡単に実装できる、Ransack Gemを使いたいと思います。

#gemファイルに追加してbundle install
gem 'ransack'

実装

・ユーザーの検索用のフォームを作ります。

app/views/users/_search_form.html.erb
<%= 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を挿入します。(この部分は各自で違うと思いますが...。)

app/views/users/index.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の時にはメッセージを表示するようにしました。

最後

・以上になりますが、とりあえずできました。
・テストは次回やってみたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1