1. fields_for
- Simple way
<%= form_with(model: rental_form, local: true) do |f| %>
  <%= f.fields_for(:terms, rental_form.terms) do |t| %>
  <div class="row my-3">
    <div class="col-11 mx-auto text-center border shadow">
        <h3>Term</h3>
        <div class="row">
          <div class="col-3 border-right">
            Start ~ End
          </div>
          <div class="col">
            <%= t.date_field :start %>
            ~
            <%= t.date_field :end %>
          </div>
        </div>
    </div>
  </div>
  <% end %>
<% end %>
it needs 2 methods
About the terms_attributes method.
- It should be as a public method.
- It is called from initializeof the ActiveModel, so you need to include ActiveModel
class Contracts::RentalForm < ApplicationForm
  attr_accessor :terms
  def terms_attributes=(attributes)
    self.terms = attributes.map{ |_, term_attributes|
      Contracts::Rentals::Term.new(term_attributes)
    }
  end
end
class ApplicationForm
  include ActiveModel::Model
end
Example of the params
attributes #=> {"0"=>{"id"=>"5", "start"=>"2020-12-23", "end"=>""}, "1"=>{"id"=>"6", "start"=>"2020-12-23", "end"=>""}}
2. manual setting
- You don't need to implement the terms_attributesmethod.
        <% rental_form.terms.each.with_index do |term, index| %>
        <div class="row">
          <div class="col-3 border-right">
            Start ~ End
          </div>
          <div class="col">
            <%= f.date_field "[terms][#{index}][start]" %>
          </div>
        </div>
        <% end %>
 

 
    
Top comments (0)