Railsでscaffoldを使い、投稿アプリを作成しました。
その中で検索窓を実装し、タイトルから検索するフォームを実装しました。
https://qiita.com/budougumi0617/items/d98fc15adea4dab438e7
この変更を参考にしましたが、覚え書きメモとして記載
【前提】
scaffold名は「review」です。
review モデル
reviewsコントローラー
review/index.htmlに投稿フォームをのせております。
reviews/indexビュー
コントローラー
モデル
ルート
に記述。
index.html.erb
<%= form_tag reviews_path, :method => 'get' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "レビューを検索する", :name => nil %>
</p>
<% end %>
メモ1: review_pathのところはモデル名に変更
review.rb
def self.search(search)
if search
Review.where(['gametitle LIKE ?', "%#{search}%"])
else
Review.all
end
end
メモ2&疑問
self.でクラスメソッドとしている。
が、同じものをモデル内には書かずにコントローラーに書いたらなぜかエラーになる。
クラスメソッドにする理由はよくわかっていない。。
【ワンポイント】
ちなみにここで、
Review.where('gametitle LIKE ? OR title LIKE ?', "%#{search}%", "%#{search}%")
とすると、複数のカラムを検索対象にすることも可能でした。
reviews_controller.rb
def index
@reviews = Review.search(params[:search])
end
route.rb
resources :reviews do
collection do
get 'search' => 'reviews#search'
end
end
メモ3:
collection do とは、
resourcesの中にルーティングを追加する動きっぽい。