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

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

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

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

0回答

227閲覧

NoMethodErrorが発生するようになり、投稿が出来なくなってしまいました

kei_murakami

総合スコア6

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/08/06 15:05

前提・実現したいこと

Railsで野球カードの画像とポジションから野球のオーダー画像を作成するアプリを作っています。
アプリの使い方としては野球カードの画像を登録し、formでポジションと選手名を選択するというものです。
オーダーのフォームの中にネストさせたプレイヤーのフォームがあり、そこでfields_forを使ってプレイヤーテーブルにcard_idとposition_idを持たせることでオーダーを作成します。
具体的にはデータベースに保存された登録済みのカードとポジション(アプリの作成者があらかじめ登録したもの)からcollection_selectを用いてデータを選択しています。

ユーザーにcard_idを持たせてFAVORITE PLAYER機能(collection_selectを利用して登録済みのカードの中からお気に入りのカードを選ぶ)を実装した後、オーダーを作成しようとするとオーダー登録時にNoMethodErrorが発生するようになり、元々は出来ていたオーダー作成が出来なくなってしまいました。
(以下のようにパラメータを入れること自体は出来ているようです。)
・ターミナルのログ
https://gyazo.com/4e37ed7f76ded61d4391604c2a203419

エラーが出るようになるまで他にも色々とアプリをいじりましたが、エラー該当箇所は特に変更していないので、もしかしたらユーザーテーブルの変更に影響を受けたのかもしれないと考えています。

エラー文で検索して同様のエラーの原因を調べた上で自分のコードを見てみましたが、おそらく誤字やリレーションの間違いではないと思います。
現在NoMethodErrorの原因を特定できていません。
原因が分かる方がいたら教えていただけないでしょうか?

説明不足でしたらお手数をおかけしますが以下をご参照ください。
・ER図
https://gyazo.com/6cbd1afe23b1a3614b6da29060bae6fa
・github
https://github.com/km19960621/ownersteam

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

NoMethodError (undefined method `position_id' for #<Order:0x007f8aaff84e18>): app/controllers/orders_controller.rb:15:in `create'

該当のソースコード

ruby

1def create 2 @order = current_user.orders.new(order_params) 3 if @order.save! 4 redirect_to orders_path, success: 'オーダーを作成しました' 5 else 6 flash.now[:danger] = "オーダーの作成に失敗しました" 7 render :new 8 end 9end 10 11(省略) 12 13private 14def order_params 15 params.require(:order).permit(:title, players_attributes: [:position_id, :card_id]) 16end 17

html

1<%= f.fields_for :players do |p| %> 2 <td class="td-position"> 3 <%= p.collection_select :position_id, Position.all, :id, :name, :include_blank => true %> 4 </td> 5 <td class="td-card"> 6 <%= p.collection_select :card_id, Card.all.order(:image_front), :id, :name, :include_blank => true %> 7 </td> 8<% end %>

試したこと

・rails db:rollbackをしてユーザーテーブルのcard_idから消してみる
・createアクションのcurrent_user.ordersをOrderに変えてみる
・rails db:migrate
・誤字を探す

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

ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin18]
Rails 5.2.3

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

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

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

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

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

suama

2019/08/06 23:16

変更を加えるまでは、Orderの作成(とネスとしたデータ)はうまく出来ていたということでしょうか? validationのところで引っかかっている気がします。orderテーブルには直接はposition_idを持っていないので、ここをコメントアウトするかplayerモデルに持ってくとかではどうでしょう?
kei_murakami

2019/08/07 03:49

おっしゃる通りでvalidationをplayerモデルに移動したところ正常に動くようになりました。 バリデーションはネストしたフォームの内側のモデルにかけなければいけなかったんですね。 githubを見ていただいた上でアドバイスを下さったようで、お手数をおかけしました。 ご丁寧にありがとうございました。
suama

2019/08/07 11:07

よかったです! 自己解決という形であれば、気がついたあたりを回答に添えていただくといいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問