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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

258閲覧

リレーション先のidを利用したい

begenner

総合スコア79

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/06/14 13:30

編集2018/06/14 14:09

現在アプリを作っています。
サイドバーにカテゴリーリストとサブカテゴリーリストを全て each_with_index を利用して表示し、それぞれのリンクへ飛ばしたいです(リレーションをしてあります)。
疑問として

  • each_with_indexではリレーションしても子モデルのidはとってこれないのでは?

ということがあります。

現状として

  • カテゴリーリストのリンクは動作する(サブカテゴリーリストのパスはコメントアウト)
  • サブカテゴリーリストのパスにsubcategory.idとするとActionController::UrlGenerationErrorのエラーが出る

といった状況でうまくいきません(m_ m)
わかる方がいらっしゃれば教えていただきますようよろしくお願いいたします(m
_m)

###追記
確認で<%= subcateroy.id %>をしてみると期待通りの数値が出ました。
なおさら原因がわかりません。
###エラー内容
ActionController::UrlGenerationErrorが発生する

###期待する動作

  • サブカテゴリーリストのパスのリンクがエラーなしで正常に動くようにしたい

###動作環境
OS:mac
Ruby:2.3.5
Ruby on Rails: 4.2.10

###該当のソースコード
db/schema.rb

ruby

1 create_table "categorys", force: :cascade do |t| 2 t.string "name", limit: 255, null: false 3 end 4 5 create_table "subcategorys", force: :cascade do |t| 6 t.string "name", limit: 255, null: false 7 t.integer "category_id", limit: 4, null: false 8 end

config/routes.rb

ruby

1 resources :categorys, only: [:show] do 2 resources :subcategorys, only: [:show] do 3 resources :products, only: [:show] 4 end 5 end

リレーション

ruby

1#app/models/category.rb 2 has_many :products 3 has_many :subcategorys 4#app/models/subcategory.rb 5 belongs_to :category 6 has_many :products

app/views/layouts/application.html.erb

ruby

1... 2 <% categorys.each_with_index do |category, i| %> 3 <b><%= link_to "#{category.name}", category_path(i+1) %></b> 4 <ul> 5 <% category.subcategorys.each do |subcategory| %> 6 <!--↓↓↓↓ここが原因で ActionController::UrlGenerationError が発生しています--> 7 <li><%= link_to "#{subcategory.name}", category_subcategory_path(subcategory.id) %></li> 8 <% end %> 9 </ul> 10 <% end %> 11...

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

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

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

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

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

guest

回答1

0

ベストアンサー

subcategory_path(subcategory) のようにかいてみては?
id そのものを渡す必要はありません。
**_path() には ActiveRecord の要素を渡します。

参考情報

  • ailsのルーティングあれこれ

https://qiita.com/senou/items/f1491e53450cb347606b

投稿2018/06/14 14:17

katoy

総合スコア22324

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

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

begenner

2018/06/14 14:23

単純に subcategory_path(subcategory) に変更するとエラー内容が NoMethodError に変わりました。 参考URLの先の内容が自分には全くわからないのですが asオプション をつかってみてはということでしょうか?
begenner

2018/06/14 14:54

ごめんなさい、slimについてはまだ勉強中なので全くわかりませんでした。 1番目に教えていただいたサイトを参考にむりやりだとは思いますが、 resources :categorys, only: [:show], shallow: true do resources :subcategorys, only: [:show], shallow: true do resources :products, only: [:show] end end でとりあえず動作しました。ありがとうございます。 もしこのルーティングの改良が可能なのであれば教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問