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

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

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

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

Ruby on Rails 4

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

Q&A

解決済

2回答

4952閲覧

ネストさせたコントローラのビューのパスが通らないです

hiyashikyuri

総合スコア388

Ruby

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

Ruby on Rails 4

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

0グッド

1クリップ

投稿2016/09/12 07:56

ルーティングはネストさせてあり、以下のようになっています。

routes.rb Rails.application.routes.draw do root 'products#index' resources :products do resources :characteristics, only: [:new] end end

そして、productsコントローラーのshowメソッドからcharacteristicsコントローラーのnewメソッドの画面へと遷移させ、データを入力していきたいのですが、パスが通りません。

/products/views/show.html.erb <h1>詳細ページ</h1> <div class="profile_list"> <table> <theader> <tr> <th>メーカー</th> <th>モデル</th><th>価格</th><th>詳細</th><th>編集</th><th>削除</th> </tr> </theader> <tbody> <tr> <td> <%= @product.maker %> </td> <td> <%= @product.model %> </td> <td> <%= @product.price %> </td> <td> <%= link_to "特性を追加", "/products/#{@product.id}/characteristics/new", method: :get %> </td> <td> <%= link_to "編集", edit_product_path(@product.id), method: :get %> </td> <td> <%= link_to "削除", product_path(@product.id), :method => :delete %> </td> </tr> </tbody> </table> </div>
/characteristics/views/new.html.erb <%= form_for @characteristic do |f| %> <div> <%= f.label :characteristic %> <%= f.text_field :characteristic, :class => "form-control" %> </div> <% end %>

こちらがエラー内容です。

NoMethodError in Characteristics#new undefined method `characteristics_path' for #<#<Class:0x007fbea1b8a800>:0x007fbea8173950> <%= form_for @characteristic do |f| %> <div> <%= f.label :characteristic %> <%= f.text_field :characteristic, :class => "form-control" %> </div>

ネストさせていなければ、パスは通るっぽいのですが、ネストさせてからだと記述を加える必要があるのでしょうか?
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、 characteristicのnewへのパスですが、new_product_characteristics_path(@product.id)でできると思います

次にフォームのところですが、モデルオブジェクトのところが<%= form_for @characteristic do |f| %>と@characteristicになっていますが、これではどのproductに結びついているかがわからなくなってしまいます。

なので、ネストした場合フォームに渡すモデルオブジェクトは<%= form_for([@product, @characteristic]) do |f| %>のように配列で渡すことでできます。

また余談ですが、このままだとルーティングのところでcharacteristicsのメソッドがnewのみになっているので、createも許可してあげないと保存されないかと思います。

また、他の回答でrake routesをあげている方がいますが、このコマンドを実行することでパスが確認できるので、やってみてください!

参考資料
Railsのルーティングを極める(前編)
Railsのルーティングを極める (後編)
RailsのScaffoldでネストしたResourceを作る

投稿2016/09/16 13:53

編集2016/09/16 13:56
nami634

総合スコア188

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

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

hiyashikyuri

2016/09/17 01:01

こんなにわかりやすい回答ありがとうございます! 無事解決できました!
guest

0

rake routesで生成されてるパス見てみてください

投稿2016/09/16 04:38

kenixi

総合スコア91

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問