前提・実現したいこと
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
あなたの回答
tips
プレビュー