こんにちは、おーしまです。
今回は、タグの検索とキーワード検索を1つのフォームで行うことができたので、紹介します。
ちなみに、タグ検索は、入力したタグがついているレビューだけを表示し、キーワード検索は、入力したキーワードがタイトルか本文に含まれているレビューを表示するものです。
それではいきましょう。
コントローラー
def search if (params[:keyword])[0] == '#' @cars = Tag.search(params[:keyword]).order('created_at DESC') else @cars = Car.search(params[:keyword]).order('created_at DESC') end end
carモデル
def self.search(search) if search != nil Car.where('title LIKE(?) or text LIKE(?)' , "%#{search}%", "%#{search}%") else Car.all end end
tagモデル
def self.search(search) if search != '#' tag = Tag.where(name: search) tag[0].cars else Car.all end end
こんな感じになりました。
まず、コントローラーで「#」がついているか見極めます。
「#」が先頭についていると、タグ検索、ついていなければ、キーワード検索、としています。
それぞれのモデルにsearchメソッドを作り、引数には、「タグ名」もしくは、「キーワード」が運ばれてきます。carモデルに「キーワード」が運ばれてきた場合には、whereメソッドを用いてtitleかtextにキーワードが含まれていれば取り出します。tagモデルに「タグ名」が運ばれてきた場合も、whereメソッドでタグを探し、そのタグに紐付くレビューを取り出します。(whereメソッドを使うと、配列になるので、[0]としている)
また、空欄で送られてきた場合と、「#」のみで送られてきた場合は、全てのレビューを表示するようになっています。
簡単ですね。
その他に、レビューの詳細画面に表記してあるタグをクリックして、そのタグの一覧表示に飛ばすには、表記してあるタグ名で検索をすれば良いということになります。つまり、、、
この部分を、、、
<%=link_to tag.name, search_cars_path(keyword: tag.name) %>
と、してあげます。
(keyword: tag.name)でパラメーターのkeywordに「タグの名前」が入ってリクエストを送ることができるため、タグ名で検索したのと同じことになります。
今回は以上です。
それでは、また〜