

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

[code]

    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モデルを更新、削除刷ることができる
    end
    
[/code]

[code]

      def new
        @time_table = TimeTable.new
        10.times do
          @time_table.artists.build
        end
      end
    
[/code]

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

[code]

    # 抜粋
         <div class="form-row">
           <%= f.fields_for :artists do |a| %>
            <div class='form-group'>
              <%= a.label :name, '10:00' %>
              <%= a.text_field :name, class:'form-control' %>
            </div>
          <% end %>
    
[/code]

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


CC BY-SA 4.0
2021-06-23T02:28:54.143
77722
2021-06-23T09:50:00.960
2021-06-23T03:44:32.440
3060
43351
question
ruby-on-rails ruby
Rails 6.0 で label の表記が変わらない


まず、accepts_nested_attributes_for は Rails
によって提供されている機能ではありますが、非常に嫌われている半ば非推奨な機能です  
<https://github.com/rails/rails/pull/26976#discussion_r87855694>

> I'd actually like to kill accepts_nested_attributes_for in due time.

なので

  1. formでやり取りするデータに対応する Form Object クラスを作成
  2. コントローラーでフォームから送信された値を使って Form Object を new
  3. Form Object 経由でデータベースに保存

とするのが望ましいと思います

仮に accepts_nested_attributes_for を使って実現するとしたら

まず accepts_nested_attributes_for は Rails
によって提供されている機能ではありますが、非常に嫌われている半ば非推奨な機能です

  * formでやり取りするデータに対応する Form Object クラスを作成
  * コントローラーでフォームから送信された値を使って Form Object を new
  * Form Object 経由でデータベースに保存

とするのが望ましいと思います

仮に accepts_nested_attributes_for を使って実現するとしたら

[code]

    # config/routes.rb
    Rails.application.routes.draw do
      resources 'foos'
    end
    
    # app/models/foo.rb
    class Foo < ApplicationRecord
      has_many :bar,
               dependent: :destroy
      accepts_nested_attributes_for :bar,
                                    allow_destroy: true
    
      # fields_for に accepts_nested_attributes_for + has_many 
      # 組み合わせであることを伝えるために必要
      def bars_attributes=(attributes)
      end
    end
    
    # app/models/bar.rb
    class Bar < ApplicationRecord
      belongs_to :foo,
                 optional: true
    end
    
    # app/controllers/foos_controller.rb
    class FoosController < ApplicationController
      def new
        @foo = Foo.new
        # 3コ子要素を作る
        @foo.bar.build
        @foo.bar.build
        @foo.bar.build
      end
    
      def create
        params.permit!
        @foo = Foo.new(params[:foo])
        @foo.save!
      end
    end
    
[/code]

[code]

    <%# app/views/foos/new.html.erb %>
    <%= form_with(model: @foo) do |f| %>
      <ul>
        <%= f.fields_for(:bar, :bar) { |f_bar| %>
          <li>index: <%= f_bar.index %></li>
          <li>name: <%= f_bar.text_field :name %></li>
        <% } %>
      </ul>
      <%= submit_tag %>
    <% end %>
    
    
    <%# app/views/foos/create.html.erb %>
    <% @foo.bar.each { |bar| %>
      <p><%= bar.name %></p>
    <% } %>
    
[/code]

のような感じになると思います

正直、このコードも fields_for のソースコードを読みながら書いたので、今後どのバージョンアップで壊れてもおかしくありません  
accepts_nested_attributes_for の利用は止めたほうが無難です


CC BY-SA 4.0
2021-06-23T09:50:00.960
77739
2021-06-23T09:50:00.960
9796
77722
answer