0
1

More than 3 years have passed since last update.

【Ruby on Rails】Ransackなしで 簡単に検索機能を実装する方法

Posted at

対象者

  •  検索機能の実装を考えている方
  •  Gemなしで検索機能を実装しようとしている方

目的

  •  検索機能を実装して投稿を表示させる

実際の手順と実例

1.前提

  • Rails 5.2.5
  • UserモデルとArticleモデルを使用します
  • 検索窓はヘッダーに設置
  • 投稿した記事の検索結果をViewに表示します

2.Modelの設定

検索対象がArticleなのでArticleモデルに記述していきます。
ここが一番の肝です

article.rb
 def self.search(search_word) #①
  Article.where(["title LIKE(?) OR body LIKE(?) OR sub_title LIKE(?)", #②
                 "%#{search_word}%", "%#{search_word}%", "%#{search_word}%"
 end

①search_wordを探すようにメソッドを定義しています。
 さらにselfメソッドはオブジェクトそのものを指しています。(Article)

②LIKEを使ってカラムを部分一致で検索します。カラムはtableによって変えてください。

3.Controllerとルーティングの設定

Controllerは下記のように設定します。

articles_controller.rb
def search
  @articles = Article.all.search(params[:keyword])
end

ルーティングは下記のように設定します。

routes.rb
 get "/search" => "articles#search"

4.検索窓の設置

ヘッダーに検索窓を設置していきます。

_header.html.erb
<%= form_with url: search_path, method: :get, local: true do |f| %>
  <%= f.text_field :keyword,placeholder: "キーワードで検索", class: "search-text"%>
  <%= button_tag type: "submit", class: "btn btn-default" do %>
    <i class="fas fa-search"></i> #①
  <% end %>
<% end %>

①検索ボタンをFontAwesomeで入力しています。

5.Viewの設定

app/views/articles/search.html.erb
 <% if @articles.exists? %> #①
    <% @articles.each do |article| %>
     <%= artcle.title %>
     <%= artcle.sub_title %>
     <%= artcle.body %>
    <% end %>
 <% else %>
    <p>該当する記事は見つかりませんでした。</p>
 <% end %>

※わかりやすくするためにCSSは削除しました。

①でif文で記事が存在するかどうかで表示結果が変わるように設定しました。

これで実装完了です!

参照

オブジェクトを理解!Rubyのselfを使う方法【初心者向け】

投稿者コメント

検索機能をさくさく実装できたので記事にしてみました。
非同期化にも挑戦したいです。

My Profile

プログラミング学習歴3ヶ月目のアカウントです!
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。 

0
1
0

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
0
1