ルーティング設定
collection... ルーティングにidがつかない
member... ルーティングにidがつく
memberで指定した場合URLの指定先にidがつくため、詳細ページのようなidが必要な場合に有効。
idが不要な場合は、collectionでルーティングを指定する。
memberの場合
例.html.erb
Rails.application.routes.draw do
resources :tweets do
member do
get 'search'
end
end
end
Prefix Verb URI Pattern
search_tweet GET /tweets/:id/search(.:format) tweets#search
form_withで検索フォーム作成
例.html.erb
<%= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form| %>
<%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %>
<%= form.submit "検索", class: "search-btn" %>
<% end %>
モデルにseachメソッドを定義
※データの処理(ビジネスロジック)は、モデルに定義するため。
tweet.rb
#引数には検索フォームから送信されたパラメータが渡される
def self.search(search)
#検索フォームが空でない場合
if search != ""
Tweet.where('text LIKE(?)', "%#{search}%")
else
Tweet.all
end
end
whereメソッド
条件に一致したレコードのインスタンスを配列で取得できる。
条件式には 'カラム名 > 5' やキーバリューの形で カラム名: 値 などの記述が可能。
また、whereメソッドを連続して記述することで、複数の条件に一致したレコードを取得することもできる。
モデル名.where('検索対象となるカラムを含む条件式')
LIKE句
whereメソッドと併用する。あいまい検索が可能。
記述例 | 実行結果 |
---|---|
where('title LIKE(?)', "a%") | aから始まるタイトル |
where('title LIKE(?)', "%b") | bで終わるタイトル |
where('title LIKE(?)', "%c%") | cが含まれるタイトル |
where('title LIKE(?)', "d_") | dで始まる2文字のタイトル |
where('title LIKE(?)', "_e") | eで終わる2文字のタイトル |
コントローラーにseachアクションを定義する
tweets_controller.rb
class TweetsController < ApplicationController
+ before_action :move_to_index, except: [:index, :show, :search]
#中略
+ def search
+ @tweets = Tweet.search(params[:keyword])
+ end
private
def move_to_index
unless user_signed_in?
redirect_to action: :index
end
end
end