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

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

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

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

Q&A

解決済

1回答

274閲覧

カテゴリーからeachリンクの記述の仕方,エラー対策

takeke

総合スコア60

Ruby

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

0グッド

0クリップ

投稿2018/04/25 10:15

ecサイト作成しているのですが改善できない箇所があるので質問させていただきます。

application.html.erbにカテゴリー一覧をeachで記述をして、そこからカテゴリーの詳細(categories/:id)に行きたいのですがエラーなどが出てうまくいかなくて困っています。

まづ実際のコードを簡略ですが載せます。

application.html.erb

<div class="left_category border1"> <ul> <% @categories.each do |category| %>      <li><%= link_to category.c_name, category %></li> <% end %> </ul> </div> <div> <%= yield %> </div>

categories/show.html.erb

<div><h1>【<%= @category.c_name %>】一覧</h1></div> <div>商品数:<%= @categories.count %> コ</div> <div> <% @categories.each do |category| %> <table> <tbody> <tr> <td> <div><%= category.title %></div> <div><%= category.price %></div> </td> </tr> </tbody> </table> <% end %> </div>

category.rb

class Category < ApplicationRecord has_many :products end

product.rb

class Product < ApplicationRecord belongs_to :category end

categories_controller.rb

class CategoriesController < ApplicationController def index @categories = Category.all end def show @category = Category.find_by(id: params[:id]) @cart = current_cart @categories = @category.products.paginate(page: params[:page], per_page: 12) end private def category_params params.require(:category).permit(:product_id, :product, :c_name) end end

products_controller.rb

class ProductsController < ApplicationController def index @products = Product.all if params[:title].present? @products = @products.get_by_name params[:title] end end def show @product = Product.find_by(id: params[:id]) @cart = current_cart end private def set_product @product = Product.find(params[:id]) end def product_params params.require(:product).permit(:title, :description, :image_url, :price, :category_id, :c_name) end end

store_controller.rb

class StoreController < ApplicationController def index @cart = current_cart @categories = Category.all @products = Product.paginate(:page => params[:page], :per_page => 12) if params[:title].present? @products = @products.get_by_name params[:title] end end end

schema.rb

ActiveRecord::Schema.define(version: 20180417103344) do create_table "categories", force: :cascade do |t| t.string "c_name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "products", force: :cascade do |t| t.string "title" t.text "description" t.string "image_url" t.decimal "price", precision: 8, scale: 2 t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "category_id" end end

こんなところでしょうか。
ルートページがstore/indexに当たります。
ここでカテゴリーの名前のリンクから詳細ページに行こうとすると、エラーが出ます、以下エラー内容です

NoMethodError in Categories#show Showing /vagrant/depot-study/app/views/layouts/application.html.erb where line #59 raised: undefined method `c_name' for #<Product:0x0b69b9f4>

ターミナルではこのように出ています

ActionView::Template::Error (undefined method `c_name' for #<Product:0x0b69b9f4>):

試しにapplication.htmlのeachないのリンクのところを<%= link_to ”適当な名前”,category%>でやるとリンク先には行けました。ただカテゴリー一覧が全て同じ名前になります。

現在は仕方なく、eachを使わないで一つづつリンク先と名前を指定してありますが、できたらeach使いたいと思っています

以上なのですが、全く改善方法がわからないのでもしお分かりになるかたいましたらご教授願いいたします。m(._.)m

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CategoriesController#showにおいて

@categories = @category.products.paginate(page: params[:page], per_page: 12)

これがapplication.html.erbで使ってるのと同名で被っちゃってるせいですね

CategoriesController#show内の方を@itemsなどの別の名前にしとけばいいでしょう

投稿2018/04/26 11:09

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeke

2018/04/30 11:47

回答ありがとうございます!原因がよくわかってなかったのでeach使用しないでいたのですが、おっしゃる通りでした!似たような名前があって混同していたのと、それぞれ定義した箇所をどの動作に使っているかがわかっていないせいでした。今回はshowで使う名前を整理し、application.htmlで使ってる名前を分けていき、showページにアクセスした際にもaplication.htmlに影響するので、ここで@categories = Category.allを追加し、回答いただいた対応したらうまくいきました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問