Несколько детей в одной форме в рельсах - PullRequest
8 голосов
/ 11 апреля 2010

У меня есть модель с произвольным числом дочерних объектов. Для простоты давайте назовем объекты Orders и Items. Я хотел бы иметь форму создания заказов, в которую я ввожу информацию о заказе, а также добавлять столько элементов, сколько я хочу. Если я нажму кнопку «Добавить еще один элемент», будет добавлен новый набор элементов формы для ввода новых данных, сумм и т. Д.

Я мог бы взломать это в чистом javascript, но я почти уверен, что должен быть более волшебный, хитрый способ сделать это, может быть, с частичным представлением или чем-то вроде Я просто слишком плохо знаком с рельсами, чтобы знать, что это такое.

Каков наилучший способ динамического добавления новых элементов формы и последующего доступа к ним в контроллере создания?

1 Ответ

15 голосов
/ 11 апреля 2010

Не могу победить этот Railscasts.com учебник, предоставленный Райаном Бейтсом.

Эпизод 196: Форма вложенной модели, pt. 1

Вот пример, который работает только с одним уровнем вложенности

Модель

модель / company.rb

class Company < ActiveRecord::Base
  has_many :people, :dependent => :destroy
  accepts_nested_attributes_for :people, :allow_destroy => true
end

Модели / person.rb

class person < ActiveRecord::Base
  belongs_to :company
end

Контроллеры

companies_controller.rb

def new
  @company = Company.new
  3.times { person = @company.people.build }
end

Просмотры

вид / компании / _form.html.erb

<% form_for @company do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>

  <%= f.fields_for :people do |builder| %> 
    <%= render "people_fields", :f => builder %>
  <% end %>

  <p><%= f.submit "Submit" %></p>
<% end %>

вид / компании / _people_fields.html.erb

<p>
  <%= f.label :name, "Person" %>
  <%= f.text_field :name %>
  <%= f.check_box :_destroy %>
  <%= f.label :_destroy, "Remove" %>
</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...