x
    
    1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<p>Each of these fields comes from its own form definition.</p><form action="/foo" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="tVeF2yOKPj4p0HlUJT-rwZxlnkZc_dloiOum3qJGWZ3b7s3l9x5A6zuVpyaa-IOBAHsHxkLycFnnIaI_38OCOQ" autocomplete="off" />  <div class="FormControl-spacingWrapper">    <div data-view-component="true">      <div class="FormControl-spacingWrapper">        <div data-view-component="true">          <primer-text-field class="FormControl width-full FormControl--fullWidth">            <label class="FormControl-label" for="_first_name_first_name">              First name              <span aria-hidden="true">*</span>            </label>            <div class="FormControl-input-wrap">              <input aria-required="true" aria-describedby="validation-573a57ab-7a0d-493c-9195-5d9ecb0b339b caption-573a57ab-7a0d-493c-9195-5d9ecb0b339b" data-target="primer-text-field.inputElement " class="FormControl-input FormControl-medium" type="text" name="[first_name][first_name]" id="_first_name_first_name" />            </div>            <div class="FormControl-inlineValidation" id="validation-573a57ab-7a0d-493c-9195-5d9ecb0b339b" hidden="hidden">              <span class="FormControl-inlineValidation--visual" data-target="primer-text-field.validationSuccessIcon" hidden><svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-check-circle-fill">                  <path d="M6 0a6 6 0 1 1 0 12A6 6 0 0 1 6 0Zm-.705 8.737L9.63 4.403 8.392 3.166 5.295 6.263l-1.7-1.702L2.356 5.8l2.938 2.938Z"></path>                </svg></span>              <span class=" FormControl-inlineValidation--visual" data-target="primer-text-field.validationErrorIcon"><svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">                  <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>                </svg></span>              <span></span>            </div>            <span class="FormControl-caption" id="caption-573a57ab-7a0d-493c-9195-5d9ecb0b339b">That which we call a rose by any other name would smell as sweet.</span>          </primer-text-field>        </div>      </div>    </div>    <div data-view-component="true">      <div class="FormControl-spacingWrapper">        <div data-view-component="true">          <primer-text-field class="FormControl width-full FormControl--fullWidth">            <label class="FormControl-label" for="_last_name_last_name">              Last name              <span aria-hidden="true">*</span>            </label>            <div class="FormControl-input-wrap">              <input aria-required="true" aria-describedby="validation-52299e5a-5e6e-42c4-a9d1-6b01cecea499 caption-52299e5a-5e6e-42c4-a9d1-6b01cecea499" data-target="primer-text-field.inputElement " class="FormControl-input FormControl-medium" type="text" name="[last_name][last_name]" id="_last_name_last_name" />            </div>            <div class="FormControl-inlineValidation" id="validation-52299e5a-5e6e-42c4-a9d1-6b01cecea499" hidden="hidden">              <span class="FormControl-inlineValidation--visual" data-target="primer-text-field.validationSuccessIcon" hidden><svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-check-circle-fill">                  <path d="M6 0a6 6 0 1 1 0 12A6 6 0 0 1 6 0Zm-.705 8.737L9.63 4.403 8.392 3.166 5.295 6.263l-1.7-1.702L2.356 5.8l2.938 2.938Z"></path>                </svg></span>              <span class=" FormControl-inlineValidation--visual" data-target="primer-text-field.validationErrorIcon"><svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">                  <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>                </svg></span>              <span></span>            </div>            <span class="FormControl-caption" id="caption-52299e5a-5e6e-42c4-a9d1-6b01cecea499">Bueller. Bueller. Bueller.</span>          </primer-text-field>        </div>      </div>    </div>  </div></form>1
2
3
4
<p>Each of these fields comes from its own form definition.</p><%= primer_form_with(url: "/foo") do |f| %>  <%= render(ComposedForm.new(f)) %><% end %>No notes provided.
No params configured.
app/forms/composed_form.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# frozen_string_literal: true# :nodoc:class ComposedForm < ApplicationForm  form do |composed_form|    composed_form.fields_for(:first_name) do |builder|      FirstNameForm.new(builder)    end    composed_form.fields_for(:last_name) do |builder|      LastNameForm.new(builder)    end  endend