LoginSignup
17

More than 5 years have passed since last update.

[Rails5]ransackってなんぞ?

Last updated at Posted at 2019-01-08

はじめに

Railsの勉強としてgem周りを触ってみる企画です。
今回は・・・

ransack

を試してみようかと思います。

どういうgemなの?

簡単にいうと検索機能を実装する時に使えるgemです。
使う機会は結構ありそうなので、覚えるためにも試していきましょう。

検証環境

以下の環境で実施しました。

[client]
・MacOS Mojave(10.14.2)
・Vagrant 2.2.2
・VBoxManage 6.0.0

[virtual]
・CentOS 7.6
・Rails 5.2.2
・ruby 2.3.1

ご参考までに。

ransack導入

1.gemのインストール

事前にRails勉強用に作成したプロジェクトで進めます。
各MVCは適当に掲示板アプリを想定してPostsコントローラーなどを生成済みです。
(index,show,editの空ページが見れる程度)

$ rails g model post
$ rails g controller posts index show edit

その前提のもと、Gemfileに以下を追記。

Gemfile
# ransack
gem 'ransack'

追記したらインストール。

$ bundle install

-----------
Fetching ransack 2.1.1
Installing ransack 2.1.1
-----------
→無事に完了。

2.ransackを使ってみる

早速ransackを使って実装してみます。
(※DBには事前にダミーデータを適当に複数件突っ込んでます。)

posts_controller.rb
def index
  # ransack
  @search = Post.ransack(params[:q])
  @posts = @search.result
end
index.html.erb
<h1>Posts#index</h1>
<p>Find me in app/views/posts/index.html.erb</p>

<%= search_form_for @search, url: posts_index_path do |f| %>
  <%= f.label :name_cont, '名前' %>
  <%= f.search_field :name_cont %>
  <%= f.submit '検索' %>
<% end %>

<table>
  <thead>
    <tr>
      <th><%= sort_link(@search, :name) -%></th>
      <th><%= sort_link(@search, :content) -%></th>
    </tr>
  </thead>
  <tbody>
    <% @posts.each do |post| %>
    <tr>
      <td><%= post.name -%></td>
      <td><%= post.content -%></td>
    </tr>
    <% end %>
  </tbody>
</table>

3.動作確認

ではサーバーを立ち上げてページを見てみましょう。

cap1.png

このように有象無象のデータ群に対して

cap2.png

"hanako"で検索をかけるとしっかりと絞り込みが出来ました!
「Name」と「Content」のソートもポチっと押すと、
ちゃんとソートされているようです。
完成!

所感

何かしらのデータを一覧画面で表示するシステムは、
こういった検索機能は基本的にワンセットなことが多いですね。
手作業でロジックを組むと大変&工数も無駄にかかってしまうので、
gemを活用していきたいと思います!

おわりに

何かお気づきの点がありましたら、
ご指摘やアドバイス等頂けると大変助かります!

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
17