1
0

More than 1 year has passed since last update.

検索フォーム

Posted at

ルーティング設定

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