0
4

More than 3 years have passed since last update.

7つのアクションのみによる検索機能

Posted at

7つのアクションのみで検索機能を実装

今回はモデル名をTweet、Comment、Userとします。
【例】今回はtweetsのindexアクションに記述します。

app/views/tweets/index.html.erb
<%= 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ディレクトリ直下にさらに新規ディレクトリを作成し、そこへコントローラーを生成した状態になっているため、通常の記述ではルーティングが設定できないためです。
【例】

config/routes.rb
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)が読み込まれ、実際に検索した時にエラーが出てします。

検索フォームの送信先

【例】

app/views/tweets/index.html.erb
<%= 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アクションに定義します。

app/controllers/tweets/searches_controller.rb
class Tweets::SearchesController < ApplicationController
  def index
    @tweets = Tweet.search(params[:keyword])
  end
end

検索結果画面のビューの作成

【例】

app/views/tweets/searches/index.html.erb
<%= 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つのアクションで検索機能ができました。

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