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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Q&A

解決済

2回答

390閲覧

form_withで複数モデルにデータを送ろうとするとエラーが発生してしまう。

mozya

総合スコア10

Ruby on Rails 5

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

0グッド

0クリップ

投稿2018/12/31 04:20

前提・実現したいこと

form_withでネストしたモデルにデータを送って保存したい。

発生している問題・エラーメッセージ

Showing /vagrant/canatap/app/views/place_talks/index.html.erb where line #150 raised: undefined method `contents' for nil:NilClass

該当のソースコード

rails5

1 2[view]place_talks/index.html.erb 3 4<%= form_with model: Location.new, url: place_talks_path,method: :post,class:"submit" do |f| %> 5 <h6>Comment</h6> 6 <%= f.text_field :comment,class: "location_comment"%> 7 8 <h6>作品名</h6> 9 <%= f.fields_for :contents, @location.contents.build do |ff| %> 10 <%= ff.text_field :name, class: "location_contents"%> 11 <% end %> 12 </span></p> 13 <%= f.submit "作成"%> 14 <% end %> 15 16[controller] 17 18 def create 19 @location = Location.new(location_params) 20 @location.contents.build 21(中略) 22    private 23    def location_params 24 params.require(:location).permit(:comment, contents_attributes:[:id,:name]) 25    end 26 27[model]location:rb 28 29 has_many :contents 30 accepts_nested_attributes_for :contents 31 32[model]content:rb 33 34 belongs_to :location

試したこと

https://qiita.com/onigirimantarou/items/1281093334b38a9cd67c
こちらを参考に試しましたがどうしてもうまくいきません・・・。

[view]の「@location.contents.build」の部分を
[controller]のcreateアクションにうつして試しましたがこちらは
エラーは出ないものの、
<%= f.fields_for :contents, @location.contents.build do |ff| %>
部分のフォームのみ表示されなくなります。

補足情報(FW/ツールのバージョンなど)

index.html.erbからform_withでcreateアクションに飛ばしていて、newは使用していません。

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

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

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

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

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

guest

回答2

0

自己解決

<%= f.fields_for :contents, @location.contents.build do |ff| %>
の部分が
<%= f.fields_for :contents do |ff| %>になっていたことが原因のようでした。

その場合フォームは表示されるのですがparamsからcontrollerに送る事ができないのですが・・・、
質問内容とずれるため一旦こちらの質問は閉めさせていただきます。
Malasさんありがとうございます。

投稿2019/01/02 01:52

mozya

総合スコア10

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

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

0

<%= ff.text_field :name, class: "location_contents"%>は
<%= f.text_field :name, class: "location_contents"%>ではないでしょうか?
<%= form_with model: Location.new, url: place_talks_path,method: :post,class:"submit" do |f| %>は
<%= form_with(model: Location.new, local: true) do |f| %>に書き換えてみてはどうでしょうか?

投稿2018/12/31 05:21

Malas

総合スコア112

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

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

mozya

2018/12/31 05:43

ご回答ありがとうございます。 > <%= ff.text_field :name, class: "location_contents"%>は > <%= f.text_field :name, class: "location_contents"%>ではないでしょうか? 試してみました。が、エラーは消えるもののフォームは表示されない、の状態でした・・・。 恐らく、ですが、<%= f.fields_for :contents, @location.contents.build do |ff| %>の部分で contentsテーブルへの追加を指定している?ので(参考URLを元にかいてるので解釈違うかもしれませんんが) contents の:nameにデータを送りたい場合は、<%= ff.text_field :name, class: "location_contents"%>になるものかと思っております。 > <%= form_with model: Location.new, url: place_talks_path,method: :post,class:"submit" do |f| %>は > <%= form_with(model: Location.new, local: true) do |f| %>に書き換えてみてはどうでしょうか? ----------------------------------------------------------------------------------------------------- views/place_talks/index.html.erb where line #146 raised: undefined method `locations_path' for #<#<Class:0x00007f57182b1350>:0x00007f571aa2cce0> ----------------------------------------------------------------------------------------------------- place_talkのindexのため、urlをぬくと上記エラーになってしまうのですが、 元の表記にlocal: trueを追加して試してみても、やはりエラーは消えるもフォームが表示されない状況です・・・。 おかげで、エラーについては、原因がわかりました。 フォームが表示されない原因を探す中で、controllerのindexアクションに @location = Location.new(location_params) @location.contents.build をかいていたので、form_withでしていた url:place_talks_path,method: :post(createアクション) と齟齬がでてエラーになっていたようです。 となると本当になぜフォームが表示されないのかがわからず・・・。 エラーでもないぶんかえって原因がさっぱりわからない状況です。 もし他に案があればお力添えいただければ幸いです。
Malas

2018/12/31 05:52

<%= f.fields_for :contents, @location.contents.build do |ff| %>ですがこちらは何を参考にして書かれたものですか? <%= f.fields_for :contents, @location.contents.build do |f| %>です。 フォームが表示されないというのはどういう状況でしょうか? 恐らくインデントが合ってないからだと思います。 <%= form_with~%>と <% end %>のインデントをそろえてください。
mozya

2018/12/31 09:38

確認いただきありがとうございます。 > <%= f.fields_for :contents, @location.contents.build do |ff| %>ですがこちらは何を参考にして書かれたものですか? 上記で書いた参考URL内でもそうだったのですが、 https://qiita.com/shizuma/items/6f56ca442111ece021b5 こちらでも、 <%= form_for @--- do |f| %> f.text_field :--- <%= f.fields_for :---- do |m| %> m.text_field :----- といった書き方になっていたのでこちらを参考にしたつもりです。 > フォームが表示されないというのはどういう状況でしょうか? > 恐らくインデントが合ってないからだと思います。 インデント修正してみましたが改善せず・・・。 状態としては、 <%= f.fields_for :contents do |ff| %>   <%= ff.text_field :name, class: "location_contents"%> <% end %> の部分がHTMLに出力されておらず、<h6>作品名</h6>のすぐ下に<%= f.submit "作成"%>がきてしまっています。 (開発ツールの検証画面で確認しています。) もしかすると<% end %>の位置がおかしいのかと<%= f.submit "作成"%>の下に2つとも<% end %>をもってきたりしましたがいずれも改善せずです・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問