Как динамически добавить поля в форму на Rails?

Собственно, есть форма создания/редактирования сущности Page. Внутри этой формы нужно рендерить все существующие Blocks, которые привязаны к этой Page (Page has_many :blocks). Сам вопрос заключается вот в чем - как в стиле rails way сделать так, чтобы кнопка "Добавить блок" через AJAX рендерила новые поля блока (которые рендерятся для уже существующих блоков внутри fields_for).

<%= form_for([@page.site, @page]) do |f| %>

  <%= model_errors(@page) %>
    
  <div class="form-group">
    <%= f.label :slug, 'Адрес' %><br>
    <%= f.text_field :slug, class: 'form-control' %>
  </div>

  <h2 class="sub-header">Блоки</h2>
  <div id="pageBlocks" class="page-blocks">
    <%= f.fields_for :blocks do |ff| %>
      <div class="form-group">
        <%= ff.label :name, 'Название' %><br>
        <%= ff.text_field :name, class: 'form-control' %>
      </div>
      <div class="form-group">
        <%= ff.label :content, 'Содержание' %><br>
        <%= ff.text_area :content, class: 'form-control' %>
      </div>
    <% end %>

    <%= link_to 'Новый блок', "#", :class => 'btn btn-default', id: 'addBlock' %>
  </div>

  <%= f.submit class: 'btn btn-default' %>

<% end %>


Форма сейчас выглядит так:

<form accept-charset="UTF-8" action="/account/sites/1/pages/1" class="edit_page" id="edit_page_1" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="patch" /><input name="authenticity_token" type="hidden" value="/kqBgcHd+97ICZaE0YrwXDtX4/TzGaawetMUawJCsss=" /></div>

  <div class="form-group">
    <label for="page_slug">Адрес</label><br>
    <input class="form-control" id="page_slug" name="page[slug]" type="text" value="/" />
  </div>

  <h2 class="sub-header">Блоки</h2>
  <div id="pageBlocks" class="page-blocks">
    
      <div class="form-group">
        <label for="page_blocks_attributes_0_name">Название</label><br>
        <input class="form-control" id="page_blocks_attributes_0_name" name="page[blocks_attributes][0][name]" type="text" value="sections5" />
      </div>
      <div class="form-group">
        <label for="page_blocks_attributes_0_content">Содержание</label><br>
        <textarea class="form-control" id="page_blocks_attributes_0_content" name="page[blocks_attributes][0][content]"></textarea>
      </div>
      <input id="page_blocks_attributes_0_id" name="page[blocks_attributes][0][id]" type="hidden" value="1" />
    
      <a class="btn btn-default" href="#" id="addBlock">Новый блок</a>
  </div>

  <input class="btn btn-default" name="commit" type="submit" value="Сохранить" />

</form>
  • Вопрос задан
  • 3153 просмотра
Пригласить эксперта
Ответы на вопрос 1
viktorvsk
@viktorvsk
Сам инпут в итоге просто должен иметь имя аналогичное тем, которые уже созданы (например, page[blocks][id]), если я вас правильно понял. И айди надо будет вычислить джаваскриптом в зависимости от того, сколько блоков на странице, а дальше скормить api.rubyonrails.org/classes/ActiveRecord/NestedAtt...

То есть, просто создастся 2 новых лейблы и 2 новых инпута, с name в том же виде, что и у уже созданного, но другим айди. Остальную работу выполнит nested_attributes
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы