Я реализовал динамические поля продукта, связанные с моей сущностью product_type, как описано здесь http://railscasts.com/episodes/403-dynamic-forms
В моем файле product.form у меня есть следующее для динамической генерации различных партиалов
<!-- dynamic fields -->
<h1>Dynamic fields</h1>
<%= form.hidden_field :product_type_id, id: "hidden_product_type_id" %>
<div id="dynamic_fields">
<%= form.fields_for :properties, OpenStruct.new(@product.properties) do |builder| %>
<% @product.product_type.fields.each do |field| %>
<%= render "products/fields/#{field.field_type}", field: field, f: builder %>
<% end %>
<% end %>
</div>
<!-- dynamic fields -->
Это все работает отлично, но у меня есть проблема, поскольку в Railcast они выбирают product_type_id при создании нового продукта, подобного этому:
def new
@product = Product.new(product_type_id: params[:product_type_id])
end
В моем сценарии у меня выпадающий списоктип продукта в форме Product:
<div class="form-group col-sm-3">
<%= form.label :product_type_id %>
<%= collection_select(:product, :product_type_id, ProductType.with_current_user(@current_user).order("name"), :id, :name, {}, {:onchange => 'on_product_type_change_in_product(this)', :class => 'custom-select', :disabled => is_readonly}) %>
</div>
Onchange связан со сценарием on_product_type_change_in_product, в котором я обнаруживаю изменение типа продукта. Я могу удалить сгенерированные поля из исходного выбранного product_type_id, например:
$("#dynamic_fields").remove() ;
Однако мне нужно найти способ, как перезагрузить следующую часть из JavaScript
<div id="dynamic_fields">
<%= form.fields_for :properties, OpenStruct.new(@product.properties) do |builder| %>
<% @product.product_type.fields.each do |field| %>
<%= render "products/fields/#{field.field_type}", field: field, f: builder %>
<% end %>
<% end %>
</div>