質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

受付中

1対多で関連づけられたモデルを指定して一覧ページを表示する方法が知りたい。

shutheonetokyo
shutheonetokyo

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1回答

0評価

0クリップ

172閲覧

投稿2022/01/16 09:25

質問失礼いたします。

現在、Railsポートフォリオとしてアパレル店舗の口コミアプリを作成しているのですが、やりたいことがうまくいかず、調べても出てこないので質問させていただきます。

やりたいこと

トップページ内の「エリアから探す」画面から、選択したエリアのみのショップだけを表示したい。
例えば「原宿」を選択すると、原宿で登録したエリアに関連づけられたショップ一覧ページのみを表示したい。

これまでの過程

ShopモデルとAreaモデルを作成し、それぞれを1対多で関連付ける。

app/models/shop.rb

class Shop < ApplicationRecord mount_uploader :image, ImageUploader belongs_to :area end

app/models/area.rb

class Area < ApplicationRecord has_many :shops end

管理者画面にてエリアとショップをそれぞれ作成し、ショップを新規登録する際にエリアも指定できるようにした。
例えば「ユニクロ 新宿西口店」を新たに作成するときに、エリアを「新宿」に指定して作成。

トップページにはショップを調べる方法として「①検索フォーム、②エリアから探す、③ジャンルから探す、④ブランドから探す」の4つの項目を用意する予定。現在②でうまくいかず困っている。
トップページのapp/views/static_pages/home.html.erbに登録したエリアを全て表示することはできたが、どのリンクを開いても全てのショップが表示され、指定したエリアの中でのショップ一覧を表示することができない。

試したこと

app/controllers/shops_controller.rbにて、@shopにエリアを指定するパラメーターを記述しようとしたが、どう書けばいいか分からない。
ransackを使って条件を指定して検索できそうなので、調べてみたが、それっぽい記事を見つけることができなかった。

app/controllers/static_pages_controller.rb

class StaticPagesController < ApplicationController PER_PAGE = 10 def home @q = Shop.ransack(params[:q]) @shops = @q.result.page(params[:page]).per(PER_PAGE) @areas = Area.all end end

app/views/static_pages/home.html.erb

<!-- static_pages area --> <div class="area"> <h1>エリアから探す</h1> <div class="card ml-3" style="width: 90%"> <div class="card-body"> <h1>東京</h1> <p class="card-text"> <% @areas.each do |area| %> <%= link_to area.name, shops_path(?), class: 'btn btn-outline-secondary btn-lg m-3' %> <% end %> </p> </div> </div> </div>

app/controllers/shops_controller.rb

class ShopsController < ApplicationController PER_PAGE = 10 def index @q = Shop.ransack(params[:q]) @shops = @q.result.page(params[:page]).per(PER_PAGE) @areas = Area.find(params(?)) end def show @shop = Shop.find(params[:id]) end end

トップページのリンク先の一覧ページは以下の通りです。

app/views/shops/index.html.erb

<div class="shop-list"> <% if @shops.present? %> <p><%= @shops.length%>件ヒットしました。</p> <% @shops.each do |shop| %> <%= link_to shop do %> <p><%= shop.name %></p> <p><%= shop.address %></p> <p><%= shop.area.name %></p> <% end %> <% end %> <% else %> <p>検索結果は見つかりませんでした。</p> <% end %> </div> <%= 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

長文、かつ分かりにくい質問となってしまい申し訳ありませんが、よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。