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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

565閲覧

[Rails6.0]ループ時のlabelの表記が変わらない

ta_ka

総合スコア3

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/23 01:28

一つのフォームで複数のモデルのレコードを更新できるように実装したいのですが、labelの表記がうまく反映されません。
time_tablesテーブルのレコードとartistsテーブルのレコードを同時に保存したいため、モデルとコントローラーは以下のコードにしています。

ruby

1class TimeTable < ApplicationRecord 2 has_many :schedules # 複数のScheduleを持っている(中間テーブル) 3 has_many :artists, through: :schedules # 複数のArtistを持っていて、中間モデルにSchedulesがある 4 belongs_to :user # Userモデルに属している 5 6 validates_associated :artists # Artistモデルのバリデーションを実行 7 accepts_nested_attributes_for :artists, allow_destroy: true # Artistモデルを更新、削除刷ることができる 8end

ruby

1def new 2 @time_table = TimeTable.new 3 10.times do 4 @time_table.artists.build 5 end 6 end 7

一括登録の仕方がわからなかったのでtimes.doを使い、artistテーブルのモデルを10回作成しようとしています。
erbファイルは以下のように記載しているのですが、ループ文が使われているため、フォーム欄は複数できるのですが、ラベルの表記が全部同じになってしまいます。

html

1# 抜粋 2 <div class="form-row"> 3 <%= f.fields_for :artists do |a| %> 4 <div class='form-group'> 5 <%= a.label :name, '10:00' %> 6 <%= a.text_field :name, class:'form-control' %> 7 </div> 8 <% end %>

ラベルだけループさせずに、それぞれのフォームに合わせたラベルを作成したいのですが、どのように実装したらよいかわからないので、教えていただきたいです。

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

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

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

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

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

asm

2021/06/23 04:26

> それぞれのフォームに合わせたラベル とは何を期待しており、現状はどのようになっていますか?
guest

回答2

0

ベストアンサー

Viewはとりあえずできたようですが、これですとどの時刻にどのArtistなのか、がわかる様にsaveできますか?
TimeTableとArtistが多対多ということは、あるArtistが他の(日の)TimeTableに登録されることもある、ということかと思います。
viewに乗せるのは artists ではなく schedules ではないのでしょうか?

その場合、

(0..9).each do | index | @time_table.schedules.build(stage_on_at: asmさんの式) end

としておいて
<%= a.label :name, a.object.stage_on_at %>
で行けるかと
Scheduleのcolumn名わからないので適当に書きました。
あ、「asmさんの式」そのままではだめか
"#{10 + index / 2}:#{index % 2 ? '00' : '30'}"
ですね。

投稿2021/06/23 23:36

winterboum

総合スコア23347

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

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

ta_ka

2021/06/24 00:55

ご指摘ありがとうございます。 仰る通り、schedulesテーブルに保存にどのArtistが保存されているかという実装です。 ```ruby class TimeTablesController < ApplicationController def new @time_table = TimeTable.new (0..9).each do |index| @time_table.schedules.build(appearance_time: "#{10 + index / 2}:#{index % 2 ? '00' : '30'}") end end ``` TimeTablesコントローラーにてこのようにし、TimeTableモデルは、 ```ruby class TimeTable < ApplicationRecord has_many :schedules # 複数のScheduleを持っている(中間テーブル) has_many :artists, through: :schedules # 複数のArtistを持っていて、中間モデルにSchedulesがある belongs_to :user # Userモデルに属している validates_associated :artists # Artistモデルのバリデーションを実行 accepts_nested_attributes_for :artists, allow_destroy: true # Artistモデルを更新、削除刷ることができる accepts_nested_attributes_for :schedules, allow_destroy: true # Schdulesモデルを更新、削除刷ることができる end ``` viewでは ```ruby <div class="form-row"> <%= f.fields_for :artists do |a| %> <div class='form-group'> <%= a.label :name, a.object.appearance_time %> <%= a.text_field :name, class:'form-control' %> </div> <% end %> <%# fields_for %> </div> ``` このように書きました。 しかし、viewにアーティストを入力するフォームが反映されなくなってしまいました。 field_for の引数が間違っているのでしょうか。
winterboum

2021/06/24 01:30

field_for は artistsではなくschedules ですね。 それと入力fieldのnameはScheduleに合わせないと。 Scheduleにはartist_id でnameでは無いと思うので、そこをどうやるか、はひと工夫ですね。
ta_ka

2021/06/24 02:23

この場合、通常の多対多の受け渡しでレコードの登録はできるものなのでしょうか? まだ技術不足なところで、実装方法が見えてきていないので、どのように実装したらよいか教えていただけたら幸いです。申し訳ございませんが、よろしくおねがいします。
winterboum

2021/06/24 04:34

create と なんとかparamsのcodeを
ta_ka

2021/06/24 22:41

いくつか方法を試してみたのですが、現状、 ```ruby (0..9).each do | index | @time_table.schedules.build(appearance_time: "#{10 + index / 2}:#{index % 2 ? '00' : '30'}") end ``` で、time_tablesテーブルに紐づくschesulesテーブルのカラムを保存しようとする。 schesulesテーブルは中間テーブルなので、artist_idが無いと保存できない。 フォームのappearance_time(出演時間カラム)として値を受け取っているため、Artistを保存することができない。 このような問題に詰まり、うまく実装ができませんでした。 rails c では@time_table.artist_idsにArtistのインスタンスを代入して保存することはできましたが、ローカルでの実装方法がわからないので教えていただけるとありがたいです。 何度もすみませんが、よろしくお願いします。
winterboum

2021/06/24 22:47

こういう場合2つのcaseが有ります。 Artistのデータが揃っていて、そこから選択する。載っていない人は登録出来ない Artistのデータにない人も登録できるようにする。その場合はArtistの登録も同時に行う 前者の方が格段に楽ですが、そうしますか?
ta_ka

2021/06/24 23:00

前者のArtistデータが揃っている場合に登録できる実装をしてみたいです。
ta_ka

2021/06/25 00:46

ありがとうございます。 一応テストデータとしてArtistのデータから保存することはできました。 ただ、 ```ruby <%= a.collection_select :artist_id, @artists, :id, :name, { prompt: true } %> ``` としているためにappearance_time(出演時間カラム)にいつ出演するかのデータが登録されません。 引数に複数のモデルを渡すことはできそうにないのでしょうか…?
winterboum

2021/06/25 02:55

hidden field で appearance_time を載せて渡しましょう
ta_ka

2021/06/26 01:29

ありがとうございます!! なんとか実装することができました!!☺ ちなみになんですが、 > Artistのデータにない人も登録できるようにする。その場合はArtistの登録も同時に行う こちらの方法で実装しようとしたらどういった手順で実装するべきなのでしょうか。 いまいちこちらの実装方法がわからないので参考までに教えていただきたいです。
winterboum

2021/06/26 03:31

これは私も模範解答はないです
ta_ka

2021/06/27 02:06

承知いたしました。 長々とご教授いただきありがとうございました! まだまだ技術不足なので、理解を深めていけるように頑張っていきたいと思います!
guest

0

fields_forを見る限り

erb

1 <%= a.label :name, "#{10 + a.index}:00" %>

にて対処できそうですが、いかがでしょうか?

投稿2021/06/23 08:24

asm

総合スコア15147

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

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

ta_ka

2021/06/23 08:50 編集

<%= a.label :name, "#{10 + a.index}:00" %> これで実装することができました!!(ドキュメントをよく読んでいませんでした…) ちなみになんですが、これを30分ごとに区切る場合(例えば10:00→10:30→11:00など)もできますでしょうか?
asm

2021/06/23 08:59 編集

"#{10 + a.index / 2}:#{a.index % 2 ? '00' : '30'}" ですかね
ta_ka

2021/06/23 10:00

"#{10 + a.index / 2}:#{a.index % 2 == 0 ? '00' : '30'}" このコードで実装することができました! きちんとドキュメント読むことの大切さがわかりました、ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問