検索機能

検索機能

ビュー

<%= 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 %>

 

searchにはcollectionmemberを用いる。

collection: idを指定しない

member: idを指定する

この差がある。idによって検索範囲を狭めたい場合はmemberって感じ。

 

ルーティングに書く

resources :tweets do
    resources :comments, only: :create
    collection do
      get 'search'
    end
  end

 

モデルに書く

  def self.search(search)
    if search != ""
      Tweet.where('text LIKE(?)', "%#{search}%")
    else
      Tweet.all
    end
  end

*モデルに書く理由

ビジネスロジック(データとのやりとりに関するメソッド)はモデルに書く。

likeについて

where('title LIKE(?)', "%c%") cが含まれるタイトル

self.searchについて

このselfはTweetもことだと思われる。コントローラーでTweet.searchとなっているので。

コントローラーに書く

 def search
    @tweets = Tweet.search(params[:keyword])
  end

 

keywordをモデルの引数(search)に渡してる。

 

処理の手順

検索フォームに入力して検索する(リクエスト)→ルーティングでsearchアクションに→コントローラーでsearchアクションを行う。モデルにメソッドが書いてるので→モデルへ。処理をしてビューに返す(レスポンス)