#1. 前提条件
app/models/genre
has_many :items
app/models/item
belongs_to :genre
genreとitemは1対多の関係となっています。
#2.genreコントローラ,view, route.rbの作成
以下のコードでジャンルのコントローラとshowページを作ります。
$ rails g controller Genres show
以下のコードをroute.rbに記載します。
config/route.rb
resources :genres, only: [:show]
以下のコードをgenre_controllerに記載します
app/controllers/genre_controller.rb
def show
@genres = Genre.all
@genre = Genre.find(params[:id])
end
#3.showページにgenreに基づいたitem一覧を表示させる
showページに以下のコードを記載
app/views/genre/show
<div class="item-index-box">
<!-- ジャンル選択のサイドバー -->
<%= render "items/genres_sidebar", genres: @genres %>
<!-- ジャンル選択のサイドバー -->
<div class="item-index">
<h3>商品一覧</h3>
<table>
<tbody>
<tr class="item-box">
<% @genre.items.each do |item| %>
<td class="item">
<%= link_to item_path(item) do %>
<%= attachment_image_tag(item, :image, :fill, 300, 300, fallback:"top.image.jpg") %><br>
<%= item.name %><br>
¥<%= item.price %>
<% end %>
</td>
<% end %>
</tr>
</tbody>
</table>
</div>
</div>
@genre.itemsとすることでgenreに基づいたitem一覧を表示させることができる。
#5. 今回の実装で学んだこと
当初itemsコントローラ内にgenreアクションを追加し、ルートもresources:items内にしていたのだがそうするとルートがitemsのidを取ってしまう為、新たにコントローラとルートを付け加えた。