##7つのアクションのみで検索機能を実装
今回はモデル名をTweet、Comment、Userとします。
【例】今回はtweetsのindexアクションに記述します。
<%= form_with(url: search_tweets_path, local: true, method: :get, class: "XXXX") do |form| %>
<%= form.text_field :keyword, placeholder: "投稿を検索する", class: "YYYY" %>
<%= form.submit "検索", class: "ZZZZ" %>
<% end %>
〜省略〜
##ディレクトリ::searchesコントローラーを作成
searches_controller.rbは、ユーザーを検索するのか投稿を検索するのか明示されていないため分からなくなります。区別できるように今回はtweetsディレクトリを用意し、そこにsearches_controller.rbを作成します。
ターミナル
rails g controller tweets::searches
【例】app/controllers/tweets/searches_controller.rb
class Tweets::SearchesController < ApplicationController
end
Tweets::の部分は、名前空間またはnamespaceと呼ばれるます。
##名前空間(namespace)
名前の集合を分割することを名前空間と呼びます。名前空間を用いることで、同様のクラス名を名付けたクラスであってもそれらを区別することができます。
今回の場合、tweetsディレクトリの配下にsearches_controller.rbを作成し、Tweets::という名前空間が付けられたため、く「tweet投稿を検索するコントローラー」ということです。
例えば、Usersディレクトリも作成したとしてSearchesControllerが同じクラス名になりますが、Users::とTweets::で名前空間によって違いが明確になります。
##namespaceメソッド
名前空間で生成されたコントローラーへのルーティングを設定する際に使用します。
名前空間を利用するとcontrollersディレクトリ直下にさらに新規ディレクトリを作成し、そこへコントローラーを生成した状態になっているため、通常の記述ではルーティングが設定できないためです。
【例】
Rails.application.routes.draw do
devise_for :users
root to: 'tweets#index'
namespace :tweets do
resources :searches, only: :index
end
resources :tweets do
resources :comments, only: :create
end
resources :users, only: :show
end
上記のようにnamespace :ディレクトリ名 do ~ endと囲む形でルーティングを記述すると、そのディレクトリ内のコントローラーのアクションを指定できます。
必ずnamespaceメソッドの記述は、resources :tweets doよりも上の行に書きます。
もし下の行に書くと、先にtweetsのshowアクション(tweets/:id)が読み込まれ、実際に検索した時にエラーが出てします。
##検索フォームの送信先
【例】
<%= form_with(url: tweets_searches_path, local: true, method: :get, class: "XXXX") do |form| %>
<%= form.text_field :keyword, placeholder: "投稿を検索する", class: "YYYY" %>
<%= form.submit "検索", class: "ZZZZ" %>
<% end %>
〜省略〜
tweets_searches_pathでパス指定します。
##コントローラーに定義
【例】今回はindexアクションに定義します。
class Tweets::SearchesController < ApplicationController
def index
@tweets = Tweet.search(params[:keyword])
end
end
##検索結果画面のビューの作成
【例】
<%= form_with(url: tweets_searches_path, local: true, method: :get, class: "XXXX") do |form| %>
<%= form.text_field :keyword, placeholder: "投稿を検索する", class: "YYYY" %>
<%= form.submit "検索", class: "ZZZZ" %>
<% end %>
〜省略〜
上記の記述で7つのアクションで検索機能ができました。