検索機能の流れ
1 検索フォームを作成する。
2 モデルにメソッドを定義する。
3 アクションを編集する。
1 検索フォームを作成する
<%= form_with url: admin_items_path, local: true, method: :get do |f| %>
<%= f.text_field :word %>
<% end %>
このフォームで送られるパラメータは、、、
{"utf8"=>"✓", "word"=>"×××", "controller"=>"admin/items", "action"=>"index"}
ポイント
クエリパラメータは特に、設定しなくても使える
クエリパラメータの作り方
book_path(book.id)
本来は、book_path(id: book.id) (idというキーにbook.idという値を入れる)
params[:word]
本来は、book_path(word: “xxx”) => wordというキーに値を入れる
複数のキーに値を入れる
book_path(word: “xxx”, search: “yyyy”)
nameというキーに値をform_withで入れる(この時のメソッドは、get)
<%= f.text :name %>
2モデルにメソッドを定義する
def self.looks(word)
if word
@items = Item.where("name LIKE?", "#{word}")
else
@items = Item.all
end
end
ポイント
1 if文でwordに値があるか(wordに値が与えらたかどうかで)条件分岐させている。
2
Item.where("name LIKE?", "#{word}")
Itemテーブルの中のnameカラムからwordの値(検索フォームで入力された値)が
含まれているものを取得している。
3
else
@items = Item.all
end
検索フォームに何も入力してないとき、全ての商品を表示する。
この記述が無いと検索フォームに名前を入力しないと商品が表示されない
3 コントローラーのアクションを編集する
def index
@items = Item.looks(params[:word])
end
このlooksは、2で定義された
ジャンル検索機能の流れ
1 アクションを編集する
def index
@genres = Genre.all
if params[:genre_id]
@genre = Genre.find(params[:genre_id])
@items = @genre.items.all
else
@items = Item.all
end
end
ポイント
1
if params[:genre_id]
パラメータで、genre_idに値がある(値が送られてきたかどうか)で、条件分岐させる
2
@genre = Genre.find(params[:genre_id])
送られてきた、genre_idと同じidのGenreを取得する
3
@items = @genre.items.all
@genreに関連するitemを全て取得し、@itemsに格納させる
4
else
@items = Item.all
end
パラメータで、genre_idが無いときitemを全て表示させる。
この記述が無いと検索フォームに名前を入力しないと商品が表示されない
2 genre_idをアクションに送る
<% @genres.each do |genre| %>
<p><%= link_to genre.name , items_path(genre_id: genre.id) %></p>
<% end %>
この時のパラメータ
<ActionController::Parameters {"genre_id"=>"1", "controller"=>"public/items", "action"=>"index"}
ポイント: link_toに任意のパラメータを付与する方法
例:
名前付きルート(group_id: 1, team_id: 2)
この時のURL
.../.../...?group_id=1?team_id=2
コントローラーで受け取る方法
params[:group_id]
params[:team_id]