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

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

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

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

Ruby on Rails

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

HTML

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

Q&A

1回答

495閲覧

配列を持つデータをループさせたtable型のフォームで編集しようとすると全ての行に配列が入ってしまう

kei_murakami

総合スコア6

Ruby

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

Ruby on Rails

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

HTML

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

0グッド

1クリップ

投稿2019/08/07 07:01

編集2019/08/24 14:23

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

提示された view に、全プレーヤーの情報を表示するように書かれているからそうなります
<%= f.fields_for :players do |p| %>
の部分。

newの画像の様にしたいのですか?
new、edit のviewのソースもつけて下さい。

追記
<% for num in 1..9 do %> の中に有る<%= f.fields_for :players do |p| %>が全選手分を書き出させてます。newのときはorderにまだplayerが登録されていないので繰り返しがなかったのです。

ですので、ここは p に 打順に応じたplayerが入るようにしてループを削除する。
<% for num in 1..9 do %> を
<% @order.players.sort_by{|p| p.打順}.each do |p| %> 
にする。

<% @order.players.sort_by{|p| p.打順}.each.with_index(1) do |p,num| %>  <tr> <td class="td-num"> <%= num %> </td> <td class="td-position"> <%= p.collection_select :position_id, Position.all, :id, :name, :include_blank => true %> </td> <td class="td-card"> <%= p.collection_select :card_id, Card.all.order(:image_front), :id, :name, :include_blank => true %> </td> </tr> <% end %>

ただschemaみたところ打順がない?
及び、newのときに予め9つplayerを作っておかないと9行並ばないので入力できなくなります。
(1..9).each{|打順| @order.plaiers.build(打順: 打順)}

打順 は適切な英単語に置き換えて下さい

投稿2019/08/10 08:45

編集2019/08/21 13:59
winterboum

総合スコア23347

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

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

kei_murakami

2019/08/11 14:08

現在は通常の投稿アプリの要領でrender_partialを使っており、newとeditとで共通のviewを使ったままになっています。 editなので、newの画像にデータが一つずつ入ったものにしたいと思っています。 連絡が遅くなってすいません。
winterboum

2019/08/11 20:14

その、 partial を使っているcodeを両方開示してください。
kei_murakami

2019/08/13 11:05

了解です。 追加しました。
winterboum

2019/08/13 11:36

なるほど。やっとやりたいことがわかってきた気がする。 省略しているところも載せていただく方が良いです。 で、 モデルは Order と Player だけですか? Team はない? Order の migration(もしくは db/schema)と 関連の定義部分(has_*とかbelongs_toとか)を載せて下さい。
kei_murakami

2019/08/21 05:31

teamモデルはありません。 了解です。orderモデルに関する情報も載せておきます。 メールが来なかったので返信をいただけていないと思い込んでおり、遅くなって申し訳ないです。
winterboum

2019/08/21 10:31

よっぱだから明日
kei_murakami

2019/08/24 14:18

ありがとうございます。 ただこのように( https://gyazo.com/61fa5298401d628eddcc2758a797412d )横に広がった表になってしまいます。 表の形を維持したままそれぞれにデータを入れたいのですが、現在のeachを外したままでそれは実現できるのでしょうか? 僕はtrやtdを中に含んで繰り返し処理を行うこと以外に思いつきませんでした。 それからeachを外して以後f.fields_forを外した場合と外さなかった場合とでeditの表示は変わりませんでした。 f.fields_forを使わないとorderモデルのeditをしながらplayerモデルのレコードを変更することはできないと思うのですが、f.fields_forは外さない方が良いということにはなりませんか? playerモデルに打順カラムがないことの問題は僕も感じています。現在はオーダー登録時の並び順で打順を管理しているので、オーダーを編集したらおそらく打順が意図したものと変わってしまいます。 またプレイヤーモデルのカラムにpresence: trueをつけているのでnewの段階では強制的に10人登録することになります。 それから質問なのですが(1..9).each{|打順| @order.plaiers.build(打順: 打順)}はnew.html.erbに記述するという解釈で正しいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問