前提・実現したいこと
Railsで野球カードの画像とポジションから野球のオーダー画像を作成するアプリを作っています。
アプリの使い方としては野球カードの画像を登録し、formでポジションと選手名を選択してオーダーを作成するというものです。
オーダーのフォームの中にネストさせたプレイヤーのフォームがあり、そこでfields_forを使ってプレイヤーテーブルにcard_idとposition_idを持たせることでオーダーを作成します。
具体的にはデータベースに保存された登録済みのカードとポジション(アプリの作成者があらかじめ登録したもの)からcollection_selectを用いてデータを選択しています。
オーダー作成のフォームはnewとeditでrender partialを使って使いまわしているのですが、editでは全ての行にオーダーが持つ全てのプレイヤーの情報が入ってしまうという状況です。
現在のフォームのtableの形を崩さず、一つの行に一つのプレイヤーのデータが入るようにするにはどのようにすれば良いのでしょうか?
説明不足でしたらお手数をおかけしますが以下をご参照ください。
・ER図
・github
発生している問題・エラーメッセージ
以下のように、編集画面で全ての行にオーダーが持つ全てのプレイヤーの情報が入ってしまいます。
https://gyazo.com/aa2d8dad91f978cd4f3dde7694032e66
該当のソースコード
ruby
1def edit 2 @order = Order.find(params[:id]) 3end
html
1<%= form_with model: @order do |f| %> 2 3(省略) 4 5 <% for num in 1..9 do %> 6 <tr> 7 <td class="td-num"> 8 <%= num %> 9 </td> 10 <%= f.fields_for :players do |p| %> 11 <td class="td-position"> 12 <%= p.collection_select :position_id, Position.all, :id, :name, :include_blank => true %> 13 </td> 14 <td class="td-card"> 15 <%= p.collection_select :card_id, Card.all.order(:image_front), :id, :name, :include_blank => true %> 16 </td> 17 <% end %> 18 </tr> 19 <% end %> 20 <tr> 21 <td class="td-num"> 22 <%= "" %> 23 </td> 24 <%= f.fields_for :players do |p| %> 25 <td class="td-position"> 26 <%= p.collection_select :position_id, Position.all, :id, :name, :include_blank => true %> 27 </td> 28 <td class="td-card"> 29 <%= p.collection_select :card_id, Card.all.order(:image_front), :id, :name, :include_blank => true %> 30 </td> 31 <% end %> 32 </tr> 33 34(省略) 35 36<% end %>
試したこと
・eachを外してみようとした(フォームに入るレコードの数が正しくなったとしても表の形が崩れると思いやめた)
補足情報(FW/ツールのバージョンなど)
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin18]
Rails 5.2.3
前提・実現したいこと
Railsで野球カードの画像とポジションから野球のオーダー画像を作成するアプリを作っています。
アプリの使い方としては野球カードの画像を登録し、formでポジションと選手名を選択してオーダーを作成するというものです。
オーダーのフォームの中にネストさせたプレイヤーのフォームがあり、そこでfields_forを使ってプレイヤーテーブルにcard_idとposition_idを持たせることでオーダーを作成します。
具体的にはデータベースに保存された登録済みのカードとポジション(アプリの作成者があらかじめ登録したもの)からcollection_selectを用いてデータを選択しています。
オーダー作成のフォームはnewとeditでrender partialを使って使いまわしているのですが、editではこのように( https://gyazo.com/aa2d8dad91f978cd4f3dde7694032e66 )全ての行にオーダーが持つ全てのプレイヤーの情報が入ってしまうという状況です。
現在のフォームのtableの形を崩さず、一つの行に一つのプレイヤーのデータが入るようにするにはどのようにすれば良いのでしょうか?
・newでの本来の形のフォーム
https://gyazo.com/57094673f3826a97186d9b22541ce2f0
説明不足でしたらお手数をおかけしますが以下をご参照ください。
・ER図
https://gyazo.com/6cbd1afe23b1a3614b6da29060bae6fa
・github
https://github.com/km19960621/ownersteam
発生している問題・エラーメッセージ
以下のように、編集画面で全ての行にオーダーが持つ全てのプレイヤーの情報が入ってしまいます。
https://gyazo.com/aa2d8dad91f978cd4f3dde7694032e66
該当のソースコード
order_controller.rb
ruby
1def edit 2 @order = Order.find(params[:id]) 3end
_form.html.erb
html
1<%= form_with model: @order do |f| %> 2 3(省略) 4 5 <% for num in 1..9 do %> 6 <tr> 7 <td class="td-num"> 8 <%= num %> 9 </td> 10 <%= f.fields_for :players do |p| %> 11 <td class="td-position"> 12 <%= p.collection_select :position_id, Position.all, :id, :name, :include_blank => true %> 13 </td> 14 <td class="td-card"> 15 <%= p.collection_select :card_id, Card.all.order(:image_front), :id, :name, :include_blank => true %> 16 </td> 17 <% end %> 18 </tr> 19 <% end %> 20 <tr> 21 <td class="td-num"> 22 <%= "" %> 23 </td> 24 <%= f.fields_for :players do |p| %> 25 <td class="td-position"> 26 <%= p.collection_select :position_id, Position.all, :id, :name, :include_blank => true %> 27 </td> 28 <td class="td-card"> 29 <%= p.collection_select :card_id, Card.all.order(:image_front), :id, :name, :include_blank => true %> 30 </td> 31 <% end %> 32 </tr> 33 34(省略) 35 36<% end %>
new.html.erb
ruby
1<%= render partial: 'form', locals: { order: @order } %> 2
edit.html.erb
ruby
1<%= render partial: 'form', locals: { order: @order } %> 2<%= link_to '削除', @order, method: :delete, data: { confirm: "削除しました" }, class: 'link' %> 3
schema.rb
ruby
1 create_table "orders", force: :cascade do |t| 2 t.integer "user_id" 3 t.string "title" 4 t.datetime "created_at", null: false 5 t.datetime "updated_at", null: false 6 end 7 8 create_table "players", force: :cascade do |t| 9 t.integer "order_id" 10 t.integer "card_id" 11 t.integer "position_id" 12 t.datetime "created_at", null: false 13 t.datetime "updated_at", null: false 14 end
order.rb
ruby
1class Order < ApplicationRecord 2 belongs_to :user, optional: true 3 4 has_many :players, inverse_of: :order 5 accepts_nested_attributes_for :players 6end
player.rb
ruby
1class Player < ApplicationRecord 2 validates :position_id, presence: true 3 validates :card_id, presence: true 4 5 belongs_to :order 6 belongs_to :card, optional: true 7 belongs_to :position, optional: true 8end 9
試したこと
・ループを外す(フォームの形が崩れると思い途中でやめました)
補足情報(FW/ツールのバージョンなど)
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin18]
Rails 5.2.3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/11 14:08
2019/08/11 20:14
2019/08/13 11:05
2019/08/13 11:36
2019/08/21 05:31
2019/08/21 10:31
2019/08/24 14:18
2019/08/24 21:43