#前提
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内に検索結果と合致するものがあれば出力し、なければ全ユーザを出力する。
これで完成!!