indexに検索機能を追加。
パラメータは、カテゴリ(sub_category_id)の1つだけにして動作確認しました。
【現状】
検索条件が効かず、allで取得されてるようです。
デバッグすると、コントローラにパラメータは渡ってますが、
クエリが発動されてません。なのに、ビューには全件表示されてます。
コントローラ
ruby
1class ItemsController < LoginController 2 3 4 def index 5 @items = Item.paginate(page: params[:page]).search(search_params) 6 end 7 8 private 9 def search_params 10 params.fetch(:search, {}).permit(:keyword, :sub_category_id, :prefecture_id) 11 end 12 13end 14
ビュー
ruby
1 2<%= will_paginate %> 3 <% @items.each do |item| %> 4 <ul> 5 <li><%= item.category.name %></li> 6 <li><%= item.sub_category.name %></li> 7 </ul> 8 <% end %> 9<%= will_paginate %>
【試したこと】
以下のsearchを使わず、、、
ruby
1@items = Item.paginate(page: params[:page]).search(search_params)
以下のように、whereに変えると指定したカテゴリで取得出来ました。
ruby
1@items = Item.paginate(page: params[:page]).where(sub_category_id: params[:sub_category_id]) 2 end
なので以下のscope :searchが原因のようですがここから調べ方が分からずです。
モデル
ruby
1class Item < ApplicationRecord 2 3 belongs_to :sub_category 4 5 scope :search, -> (search_params) do 6 return if search_params.blank? 7 8 keyword_like(search_params[:keyword]) 9 .sub_category_id_is(search_params[:sub_category_id]) 10 .prefecture_id_is(search_params[:prefecture_id]) 11 end 12 scope :keyword_like, -> (keyword) { where('description LIKE ?', "%#{keyword}%") if keyword.present? } 13 scope :sub_category_id_is, -> (sub_category_id) { where(sub_category_id: sub_category_id) if sub_category_id.present? } 14 scope :prefecture_id_is, -> (prefecture_id) { where(prefecture_id: prefecture_id) if prefecture_id.present? } 15 16 17end 18
もう1つ不思議なのがクエリ発行されてないのに、なぜ全件取得になっているのでしょう??
分かる方宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。