Обновление:
Поскольку я пытался проследить за этой вложенной формой Railscast , самая большая проблема заключалась в том, что я не осознавал, что версия, над которой работает Райан Бейтс, - «Редактировать», а не «Новая», поэтому Я добавил Продукты, Опции и Значения через консоль и получил форму, работающую с этим кодом:
_form.html.erb
<%= f.fields_for :options do |builder| %>
<%= render 'option_fields', f: builder %>
<% end %>
_option_fields.html.erb
<fieldset class='form-group'>
<%= f.hidden_field :account_id, value: current_user.account.id %>
<%= f.label :name, 'Option' %>
<%= f.text_field :name, class: 'form-control' %>
<br>
<%= f.check_box :_destroy, class: 'form-check-input' %>
<%= f.label :_destroy, 'Remove Option' %>
<small id="optionHelp" class="form-text text-muted">
(e.g. "Size" or "Color")
</small>
<%= f.fields_for :option_values do |builder| %>
<%= render 'option_value_fields', f: builder %>
<% end %>
</fieldset>
_option_value_fields.html.erb
<fieldset class='form-group'>
<%= f.hidden_field :account_id, value: current_user.account.id %>
<%= f.label :name, 'Value' %>
<%= f.text_field :name, class: 'form-control' %>
<br>
<%= f.check_box :_destroy, class: 'form-check-input' %>
<%= f.label :_destroy, 'Remove Value' %>
<small id="optionValueHelp" class="form-text text-muted">
(e.g. "Small, Medium, Large" or "Red, Green, Blue")
</small>
</fieldset>
Кроме того, единственное отличие от Railscast заключается в использовании сильных параметров в контроллере, так что вам просто нужно вложить их так:
ProductsController
def product_params
params.require(:product).permit(:account_id, :name, options_attributes [:id, :account_id, :name, :_destroy, option_values_attributes: [:id, :account_id, :name, :_destroy]])
end
OptionsController
def option_params
params.require(:option).permit(:account_id, :name, option_values_attributes [:id, :account_id, :name, :_destroy])
end
OptionValuesController
def option_value_params
params.require(:option_value).permit(:account_id, :option_id, :name)
end
Вместо того, чтобы строить вложенные объекты в контроллере, я собираюсь сделать это с Javascript, как в эпизоде с Railscast, или с Cocoon gem , как Vasilisa , предложенным в ее ответе.
Просто хотел поделиться кодом, который на самом деле работал, на случай, если кто-то столкнется с подобными проблемами. Я думаю, что Railscast, хотя и старый, все еще является отличным введением во вложенные формы в Rails, но вы просто должны знать об изменениях, необходимых для использования form_with и сильных параметров. Большое спасибо Василисе за помощь в этом.
Основные "ошибки", на которые нужно обратить внимание при следовании за Rails Nested Form Railscast , таковы:
- form_with имеет некоторый синтаксис, отличный от старых rails form_tag
- Убедитесь, что у вас нет проблем с опечатками или именами при создании блоков формы, потому что они вложены дважды
- То же самое с параметрами вложенности в ваших контроллерах, просто помните ваш синтаксис и опечатки
- Имейте в виду, что Райан Бейтс демонстрирует данные, которые не были добавлены через форму, которую он строит, поэтому, если вы хотите следовать, вам нужно будет создать некоторые данные в консоли
- С сильными параметрами вам придется явно указать
:_destroy
в качестве параметра, чтобы его флажки "Удалить" работали