Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

Rails5.2 アプリに検索機能を実装

updated on 2019-07-26

イメージ

Rails5.2 アプリに検索機能を実装

環境


Rails 5.2.1

ruby 2.4.2


目的


Postテーブルのtitleから投稿を検索する機能の実装

postsテーブルの構造

create_table "posts", force: :cascade do |t|
  t.string "title"
  t.text "body"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

実装


手順1. モデル内にクラスメソッドを追記

selfを忘れない。selfが抜けるとインスタンスメソッドになってしまう。

ILIKE - 条件検索で大文字小文字を区別させないために今回はLIKEではなく、ILIKEを使った。

ここ大事です。

(mode/post.rb)
class Post < ApplicationRecord

  def self.search(search)
    if search # Controllerから渡されたパラメータが!= nilの場合は、titleカラムを部分一致検索
      Post.where(['title ILIKE ?', "%#{search}%"])
    else
      Post.all #全て表示。
    end
  end

end


手順2. 検索フォームのViewを記述

ルートページだけ検索機能が欲しかったので posts/index.html.erbに以下を追記

(posts/index.html.erb)
<%= form_tag posts_path, :method => 'get' do %> 
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>
<% @posts.each do |post| %>
  <div class="text-center">
    <h2><%= article.title %></h2>
    <h6><%= article.created_at.strftime('%b %d, %Y') %></h6>
  </div>
<% end %>


手順3. コントローラーでパラメータを渡す

(posts_constoller.rb)

class PostsController < ApplicationController
  def index
    @posts = Post.search(params[:search])
  end
end


このサイト右上の検索にも実装してます。動作確認とかどうぞ!


以上で終了!!


まとめ

検索機能は、プラグインとか使わなくても簡単に実装できる。

gem 'ransack'とかでの検索機能が流行ってるけど、なるべく自分で作れそうなものは作った方が良い!!(カスタマイズとかしやすいし、仕組みもわかってた方が良い)



参考資料

https://freesworder.net/rails-search/