対象者
- 検索機能の実装を考えている方
- 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文で記事が存在するかどうかで表示結果が変わるように設定しました。
これで実装完了です!
参照
投稿者コメント
検索機能をさくさく実装できたので記事にしてみました。
非同期化にも挑戦したいです。
My Profile
プログラミング学習歴3ヶ月目のアカウントです!
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。