BETA

【Rails】検索機能

投稿日:2019-12-13
最終更新:2019-12-13

Railsで検索機能の実装をしていきます。

参考

https://www.for-engineer.life/entry/rails-search-form/
https://qiita.com/yusuko/items/cff4e46aeafbc3beecf2

やること

既存のユーザ一覧のページに、ユーザ検索フォームを設置して、検索ボタンを押すと検索したユーザのみが表示される。

*ユーザ一覧画面

*ユーザ検索後

*ユーザ名が一部被っているだけでも検索に引っかかる

こうなるように実装します。

controller

users_controller.rb

  def index  
    @search_users = User.all.page(params[:page]).search(params[:search])  
  end  

View側で設定した検索ワードを配列に格納してあります。
検索ワードを基にしてUserテーブルから、.search(params[:search]) 処理を呼び出すことが出来ます。

Model

model/user.rb

~~~~  
    def self.search(search)   
        if search  
          where(['name LIKE ?', "%#{search}%"])   
        else  
          all  
        end  
    end  

このメソッドを追加します。
このメソッドはコントローラから呼び出すものです。
コントローラで、このようにしてUser.all.page(params[:page]).search(params[:search]) 呼び出されているわけですが、self.search(search)self はUserテーブルのUser を指しています。
なので、ここではUserテーブルから任意の文字列を検索をすることが出来ます。

        if search  
          where(['name LIKE ?', "%#{search}%"])   

では、検索ワード(search)がある場合に処理を行います。
Userテーブルのカラム(name)から(LIKE)、検索ワード(search)にかする文字列はないか見ているわけです。

        else  
          all  
        end  

では、検索ワードが無い場合に、Userテーブルから全てのレコードを返すようにしています。

これで、検索されると検索したユーザのみ、検索されてない(通常の)状態だと全ユーザのみが表示されるようになります。

View

<p>User search</p>  
<%= form_tag(users_path, :method => "get") do %>  
  <p>  
    <%= text_field_tag :search, params[:search] %>  
    <%= submit_tag "Search", :name => nil %>  
  </p>  
<% end %>  

<% if @search_users %>  
  <ul class="media-list">  
    <% @search_users.each do |user| %>  
      <li class="media">  
        <div class="media-left">  
          <img class="media-object img-rounded" src="<%= gravatar_url(user, { size: 50 }) %>" alt="">  
        </div>  
        <div class="media-body">  
          <div>  
            <%= user.name %>  
          </div>  
          <div>  
            <p><%= link_to 'View profile', user_path(user) %></p>  
          </div>  
        </div>  
      </li>  
    <% end %>  
  </ul>  
  <%= paginate @search_users %>  
<% end %>  

ユーザ検索フォームと、ユーザを表示しる処理を記述しています。

ユーザ検索フォーム

<p>User search</p>  
<%= form_tag(users_path, :method => "get") do %>  
  <p>  
    <%= text_field_tag :search, params[:search] %>  
    <%= submit_tag "Search", :name => nil %>  
  </p>  
<% end %>  

ユーザ一覧画面(indexページ)で使う処理なので、users_path では、user/index の処理がコントローラから呼び出されます。
method => "get" では、UserテーブルへのGETが行われます。
params[:search] は検索処理を行うための引数となります。
submitボタンを押すと、コントローラのindex に記述されている処理が動いて、ページがリロードされたかのようになるので面白いです!

ユーザ一覧表示処理については、解説を書かなくても大丈夫でしょう。。

まとめ

やってみれば簡単なもんです。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

初学者の成長が垣間見れます

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう