У меня есть приложение rails 4, где я следую в основном этому railscast:
_form.html.erb:
<%= form_for @store, do |f| %>
<%= f.fields_for :products do |builder| %>
<%= render "product_fields", f: builder %>
<% end %>
<%= link_to_add_fields "Add Product", f, :products %>
<% end %>
_product_fields.html.erb
<%= f.select :the_product_type, %w[Shelves, Tools, Wires]%>
<div>
<%= f.fields_for :product_fields do |builder| %>
<%= builder.text_area :name_of_product_field %>
<% end %>
</div>
Мой JS выглядит так:
$('form').on('click', '.add_fields', function(e) {
var regexp, time;
time = new Date().getTime();
regexp = new RegExp($(this).data('id'), 'g');
$(this).before($(this).data('fields').replace(regexp, time));
return e.preventDefault();
});
Моя проблема в том, что когда я нажимаю кнопку "Добавить продукт", я могу видеть только выбор. Я не вижу текстовое поле name_of_product_field. Но я не могу понять, почему я вижу выбор, если я не вижу текстовое поле?
product_fields
вложенный атрибут, который вы не build
в любом месте вашего кода, поэтому вы не видите его.
Предполагая, что продукт has_many product_fields, вы можете решить эту проблему двумя способами, выберите тот, который вам подходит:
1. Постройте его на уровне контроллера
Создайте поле product_fields
в Controller#action
которое создает проблематичное представление:
def action_name
@store = Store.new
product = @store.products.build
product.product_fields.build
end
2. Создайте его на уровне просмотра
Обновите fields_for
в _product_fields.html.erb
как _product_fields.html.erb
ниже:
<%= f.fields_for :product_fields, f.object.product_fields.build do |builder| %>
html
?product_fields
? Кроме того, вы должны взглянуть на жемчужинуcocoon
, она должна сделать вашу жизнь проще - не слишком легкой, хотя вы хотите здесь вложенных ассоциаций. (Не знаю, рекомендуется ли это в скринкасте, так как это премиум, но по комментариям это не так)