12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby on Railsでransackを用いた検索機能の実装

Last updated at Posted at 2017-07-21

#前提
Railsチュートリアル第10章が完成していること

#用意
今回はgemの一種で検索機能を簡単に実装してみる!

gemfile
   source 'https://rubygems.org'
   gem 'rails',           '5.0.3'
                   :
                   :
   gem 'ransack'  #新たに記述
インストール
 $ bundle install

これでransackの準備ができた。

#実装
ransackをインストールすると
searchメソッドと
resultメソッドが使用できるようになる。

コメントである通りsearchメソッドは他のgemや自身のプログラム内でコンフリクトが起こる可能性があるため非推奨のようだ。

そのためsearchメソッドの使用よりもransackメソッドを使用することが推奨されている。

UserController
def index
  @users  = User.paginate(page: params[:page])
  @search = User.ransack(params[:q])  #追加
  @result = @search.result           #追加
end
views/users/index.html.erb
<% provide(:title, 'All users') %>
<h1>All users</h1>

<%= search_form_for @search  do |f| %>
  <div class="form-group">
    <%= f.label :name_cont, "Name" %>
    <%= f.text_field :name_cont, class: "form-control" %>
  </div>
  <div class="actions"><%= f.submit "Search" %></div>
<% end %>

これだけので検索ユーザの名前で検索することができるフォームが完成。

しかし、検索結果を表示するコードも書かないといけなかった。

views/users/index.html.erb
<% provide(:title, 'All users') %>
<h1>All users</h1>

<%= search_form_for @search  do |f| %>
  <div class="form-group">
    <%= f.label :name_cont, "Name" %>
    <%= f.text_field :name_cont, class: "form-control" %>
  </div>
  <div class="actions"><%= f.submit "Search" %></div>
<% end %>

<% if @result.any? %>
  <%= render @result %>
<% end %>

<% if @result.nil? %>
  <ul class="users">
    <%= render @users %>
  </ul>
<% end %>

result内に検索結果と合致するものがあれば出力し、なければ全ユーザを出力する。

これで完成!!

12
14
1

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
12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?