0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

javascriptを使わずカテゴリ別に表示させる

Posted at

#はじめに
クチコミサイトを作成している中で、登録商品をカテゴリ別に表示させたいなーと思い、実装しましたのでその過程を残しておこうと思います。
ページ遷移させず表示するにはjavascriptの知識が必要ということで、今回はページ遷移させて表示させていきます。
こんな感じです。
GIF.gif

#実装
今回の流れは以下のようになります。
①categoryモデルの作成。
②itemモデルとcategory_idを紐づける。
③アイテム一覧のページでカテゴリを選択した際に、カテゴリーコントローラーのインデックスアクションに飛ぶように設定。
④カテゴリーのインデックスアクションで、category_idに紐づいているアイテムを表示。

①categoryモデルの作成。
今回は各itemにcategoryが紐づく形にしたいので、categoryモデルを作成します。

$ rails g migration AddCategoryToItems category:reference

そして作成されたファイルに以下のように記述します。

日付_add_category_to_items.rb
class AddCategoryToItems < ActiveRecord::Migration[5.2]
  def change
    add_reference :items, :category, foreign_key: true
  end
end

②itemモデルとcategory_idを紐づける。
itemモデルとcategoryモデル内にbelong_toとhas_manyを追記する。

models/item.rb
class Item < ApplicationRecord
   belongs_to :category, optional: true
end
models/category.rb
class Category < ApplicationRecord
    has_many :items
end

③アイテム一覧のページでカテゴリを選択した際に、カテゴリーコントローラーのインデックスアクションに飛ぶように設定。
次にカテゴリ別に表示したいページにてリンクを作成する。

views/items/index.rb
~省略~
  <div class="nav-link active"><%= link_to category.category_name, categories_path(category_id: category.id),  %></div>

ここでは商品を一覧表示しているページにカテゴリリンクを作成しています。
末部をcategories_pathだけにするとパラメータが渡らないので、categories_path(category_id: category.id)
とする必要があります。
これによってURLの末尾が「categories?category_id=」となり、パラメータの値がしっかりと渡せるようになります。

④カテゴリーのインデックスアクションで、category_idに紐づいているアイテムを表示。

app/controller/categories_controller.rb
class CategoriesController < ApplicationController
  def index
    @items = Item.where(category_id: params[:category_id]).page(params[:page]).per(12).search(params[:search])
    @categories = Category.all
  end
end

#補足
各アイテムの登録時にcategory_idがしっかりと紐づくよう引数に注意してください。
例えば以下のようにすると上手く引数が渡りません。

views/items/new.html.erb
~省略~
<%= f.label :category_name, "カテゴリ" %><br>
  <%= f.collection_select :category_name, Category.all, :category_name, :category_name, class: "form-control", include_blank: "選択して下さい"   %> 

正しくは以下のようになります。

views/items/new.html.erb
<%= f.label :category_name, "カテゴリ" %><br>
  <%= f.collection_select :category_id, Category.all, :id, :category_name, class: "form-control", include_blank: "選択して下さい"   %> 
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?