質問失礼いたします。
現在、Railsポートフォリオとしてアパレル店舗の口コミアプリを作成しているのですが、やりたいことがうまくいかず、調べても出てこないので質問させていただきます。
やりたいこと
トップページ内の「エリアから探す」画面から、選択したエリアのみのショップだけを表示したい。
例えば「原宿」を選択すると、原宿で登録したエリアに関連づけられたショップ一覧ページのみを表示したい。
これまでの過程
ShopモデルとAreaモデルを作成し、それぞれを1対多で関連付ける。
app/models/shop.rb
1class Shop < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 4 belongs_to :area 5end
app/models/area.rb
1class Area < ApplicationRecord 2 has_many :shops 3end
管理者画面にてエリアとショップをそれぞれ作成し、ショップを新規登録する際にエリアも指定できるようにした。
例えば「ユニクロ 新宿西口店」を新たに作成するときに、エリアを「新宿」に指定して作成。
トップページにはショップを調べる方法として「①検索フォーム、②エリアから探す、③ジャンルから探す、④ブランドから探す」の4つの項目を用意する予定。現在②でうまくいかず困っている。
トップページのapp/views/static_pages/home.html.erb
に登録したエリアを全て表示することはできたが、どのリンクを開いても全てのショップが表示され、指定したエリアの中でのショップ一覧を表示することができない。
試したこと
app/controllers/shops_controller.rb
にて、@shopにエリアを指定するパラメーターを記述しようとしたが、どう書けばいいか分からない。
ransackを使って条件を指定して検索できそうなので、調べてみたが、それっぽい記事を見つけることができなかった。
app/controllers/static_pages_controller.rb
1class StaticPagesController < ApplicationController 2 3 PER_PAGE = 10 4 5 def home 6 @q = Shop.ransack(params[:q]) 7 @shops = @q.result.page(params[:page]).per(PER_PAGE) 8 @areas = Area.all 9 end 10 11end
app/views/static_pages/home.html.erb
1<!-- static_pages area --> 2 3<div class="area"> 4 <h1>エリアから探す</h1> 5 <div class="card ml-3" style="width: 90%"> 6 <div class="card-body"> 7 <h1>東京</h1> 8 <p class="card-text"> 9 <% @areas.each do |area| %> 10 <%= link_to area.name, shops_path(?), class: 'btn btn-outline-secondary btn-lg m-3' %> 11 <% end %> 12 </p> 13 </div> 14 </div> 15</div>
app/controllers/shops_controller.rb
1class ShopsController < ApplicationController 2 3 PER_PAGE = 10 4 5 def index 6 @q = Shop.ransack(params[:q]) 7 @shops = @q.result.page(params[:page]).per(PER_PAGE) 8 @areas = Area.find(params(?)) 9 end 10 11 def show 12 @shop = Shop.find(params[:id]) 13 end 14end
トップページのリンク先の一覧ページは以下の通りです。
app/views/shops/index.html.erb
1<div class="shop-list"> 2 <% if @shops.present? %> 3 <p><%= @shops.length%>件ヒットしました。</p> 4 <% @shops.each do |shop| %> 5 <%= link_to shop do %> 6 <p><%= shop.name %></p> 7 <p><%= shop.address %></p> 8 <p><%= shop.area.name %></p> 9 <% end %> 10 <% end %> 11 <% else %> 12 <p>検索結果は見つかりませんでした。</p> 13 <% end %> 14</div> 15 16<%= paginate @shops %>
結論
(?)の箇所にエリアを関連づけたショップだけを表示するためのコードが分かれば解決すると考えてみたのでですが、どういう風に書けばよいか教えて頂きたいです。
そもそも根本的な方法が違っているかどうかも不安な知識レベルなので、より効率的な表示方法を教えていただければありがたく思います。
また、shopsテーブルとareasテーブル、genresテーブル、brandsテーブルの関連付け(1対多)の状態のまま作成を進めていいのかも不安なので、もし間違っていたらご指摘していただくとなおありがたく思います。現在のER図を添付しておきます。
念の為、現在のshopsとareasのrails routesの結果も添付しておきます。
shops GET /shops(.:format) shops#index POST /shops(.:format) shops#create new_shop GET /shops/new(.:format) shops#new edit_shop GET /shops/:id/edit(.:format) shops#edit shop GET /shops/:id(.:format) shops#show PATCH /shops/:id(.:format) shops#update PUT /shops/:id(.:format) shops#update DELETE /shops/:id(.:format) shops#destroy areas GET /areas(.:format) areas#index POST /areas(.:format) areas#create new_area GET /areas/new(.:format) areas#new edit_area GET /areas/:id/edit(.:format) areas#edit area GET /areas/:id(.:format) areas#show PATCH /areas/:id(.:format) areas#update PUT /areas/:id(.:format) areas#update DELETE /areas/:id(.:format) areas#destroy
長文、かつ分かりにくい質問となってしまい申し訳ありませんが、よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/17 06:20
2022/01/19 23:33
2022/01/21 05:36