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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Q&A

解決済

2回答

990閲覧

Railsで親子孫を1つのビューで投稿できるようにしたい

m.shinji

総合スコア20

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

0グッド

0クリップ

投稿2019/06/05 17:02

実装したいことと現状の問題点

Rails5で親子孫のアソシエーションの作り、一つの投稿フォームから投稿できるようにしたいのですが、親子までの部分であれば、投稿はできるようになったのですが、そこに孫テーブルにも同じフォームから投稿してデータを入れたいのですが、エラーが出てしまっています。

関連コード

Model

1class Parent < ApplicationRecord 2 #Childrenとのアソシエーション(1:多) 3 has_many :children 4 accepts_nested_attributes_for :children 5end 6 7class Child < ApplicationRecord 8 #parentsとのアソシエーション(1:多) 9 belongs_to :parent, optional: true 10 11 #Grandchildとのアソシエーション(1:1) 12 has_one :grandchild 13 accepts_nested_attributes_for :grandchild 14end 15 16class Grandchild < ApplicationRecord 17 #childとのアソシエーション(1:1) 18 belongs_to :child 19end

view

1<%= form_for(@parents, url:{controller:'parents', action:'create'})do |f| %> 2... 3 <%= f.fields_for :children do |i| %> 4 ... 5 <%= i.fields_for :grandchild do |ii| %> 6 ... 7 <% end %> 8 <% end %> 9<% end %>

controller

1class ParentsController < ApplicationController 2 def new 3 @parents = Parent.new 4 @parents.children.build 5 @parents.children.grandchild.build 6 end 7 8 private 9 def submit_params 10 params.require(:parent).permit(:name, :old, children_attributes: [:name,:old, grandchild_attributes: %(name)]) 11 end 12end

発生しているエラー

コントローラーの「@parents.children.grandchild.build」でNoMethodErrorが出てしまっています。

試したこと

エラーが出ている部分の書き方を様々なサイトを参考に少し変えたり、(ex.)しましたが、直らず。
「@parents.children.grandchild.build」を消すと、Viewでエラーが出たりしていました。

その他

プログラミング歴が浅く、言葉など伝わりづらい部分があるかと思いますが、何卒よろしくお願いします。

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

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

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

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

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

winterboum

2019/06/10 22:41

class Child, Grandchild の _*, belongs_to 周りのcodeを追記して下さい
guest

回答2

0

自己解決

viewファイルで下記の孫の部分を

html

1link_to_add_association

とすることで解決できました。

投稿2019/06/19 09:10

m.shinji

総合スコア20

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

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

0

children は複数なので、それぞれに対して実行する必要があると思います

ruby

1@parents.children.each do |child| 2 child.grandchild.build 3end

もしくは build 時の1件しか無いことが確定しているなら first で中身を取ってきても良いかも

ruby

1@parents.children.first.grandchild.build

投稿2019/06/06 07:36

Ighrs

総合スコア656

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

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

m.shinji

2019/06/06 10:28 編集

前者の方で試した結果、NameError in ParentsController#new(undefined local variable or method `each')が出て、 後者だと、NoMethodError in ParentsController#new(undefined method `category' for nil:NilClass)が出ます... ここには記載していませんが、Parentsテーブルと別のテーブルで多対多の関係を作っていて、 @parents = Parent.new @parents.children.build の間にそれも読み込む記載をしていて、 @parents = Parent.new @hoges = hoge.all @parents.children.build となっています。 その部分でエラーは出ていないのでエラーに直結していないとは思いますが、関係あるかもしれないので、お伝えします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問