検索フォームの作り方が分からず非常に苦労したため備忘録として残しておく。
検索の流れ
- 検索フォームへキーワード入力
- 該当するページへ遷移
- キーワードを入れずに検索した場合は全データを表示
viewに検索フォームを記述
index.html.erb
<%= form_tag search_path, method: :get do %>
<%= text_field_tag :search, params[:search], class: '適宜', placeholder: '適宜' %>
<%= submit_tag 'search' %>
<% end %>
form_tag: モデルに基づかないformを作る際に利用 ※検索機能ではこちらを使う
form_for: 任意のモデルに基づいたformを作る際に利用
methodをgetで指定
コントローラーにsearchアクションを追加
viewの検索formで取得したパラメータをモデルへ渡す
pages.controller
def search
@search = House.search(params[:search])
end
モデルにsearchメソッドを記述
house.rb
①
def self.search(search)
return House.all unless search
House.where(['city LIKE?', "%#{search}%"])
end
①か②の記述(どちらも意味は同じ)
②
def self.search(search)
if search
House.where(['city LIKE?', "%#{search}%"])
else
House.all
end
end
- 上記のsearchメソッドはコントローラーに記述しても良いが、今後も同じような記述が増えた場合に、後日見返した時や他人が見た時にわかりにくいのでモデルに記述する。
- whereメソッドは、該当するデータを全て返すので検索結果を一覧で表示したい時に使う。
- cityの部分は検索をかける際のカラムを指定している
- "%#{search}%"は、"%検索したい文字列%"のように検索したい文字列の前後を%で挟むことで部分一致の検索ができる記述。
遷移先のviewに検索結果を表示する
search.html.erb
<% @search.each do |house| %>
<%= link_to house_path(house.id)%>
<% end %>
まとめ
コントローラーに記述しすぎるのはよくないので、適宜モデルに記述していくことで可読性を高める。