Javascript 在Rails中动态生成三层深嵌套表单
我试图使用示例创建一个包含动态生成内容的深度嵌套表单,但是当我尝试进行多个级别的深度嵌套时,我遇到了一些问题,因为内容生成在第一个生成的表单中不止一次,并且在我尝试从生成内容的第二个级别添加字段时不会导致任何事情发生 简化模型布局Javascript 在Rails中动态生成三层深嵌套表单,javascript,ruby-on-rails,Javascript,Ruby On Rails,我试图使用示例创建一个包含动态生成内容的深度嵌套表单,但是当我尝试进行多个级别的深度嵌套时,我遇到了一些问题,因为内容生成在第一个生成的表单中不止一次,并且在我尝试从生成内容的第二个级别添加字段时不会导致任何事情发生 简化模型布局 Task has_one VendorUpload has_many VendorShippingLogs has_many VendorShippingLogProducts 供应商配送日志产品是我遇到的问题,因为该表单试图在供应商配送日志
Task
has_one VendorUpload
has_many VendorShippingLogs
has_many VendorShippingLogProducts
供应商配送日志产品是我遇到的问题,因为该表单试图在供应商配送日志内容中生成其内容,而供应商配送日志内容本身是动态生成的,我不确定如何将其编码到自己的帮助器中。所附代码
型号-->
应用程序\u helper.rb-->
new.html.erb-->
这里的代码基本上模仿了示例中的所有内容,适用于一个级别的深层嵌套属性,但除此之外的任何内容都不起作用。当我试图点击上面代码中的“添加产品”按钮时,我没有得到任何反馈
我希望我在这里把每件事都说得足够清楚,因为作为一个新手,这是一个很难解释的问题。如果方向正确,我们将不胜感激 这可能值得一试:
$(function() {
$(document).on('click', 'a.add_child', function() {
var association, new_id, regexp, template;
association = $(this).attr('data-association');
template = $('#' + association + '_fields_template').html();
regexp = new RegExp('new_' + association, 'g');
new_id = (new Date).getTime();
$(this).parent().before(template.replace(regexp, new_id));
$();
return false;
});
});
jQuery中的普通单击事件不会绑定到动态生成的内容。您应该在
上使用
def new
@task = Task.new
@task.build_vendor_upload.vendor_shipping_logs.build.vendor_shipping_log_products.build
end
private
def task_params
params.require(:task).permit!
end
def new_child_fields_template(form_builder, association, options = {})
options[:object] ||= form_builder.object.class.reflect_on_association(association).klass.new
options[:partial] ||= association.to_s.singularize
options[:form_builder_local] ||= :f
content_for :jstemplates do
content_tag(:div, :id => "#{association}_fields_template", :style => "display: none") do
form_builder.fields_for(association, options[:object], :child_index => "new_#{association}") do |f|
render(:partial => options[:partial], :locals => { options[:form_builder_local] => f })
end
end
end
end
def add_child_link(name, association)
link_to(name, "javascript:void(0)", :class => "add_child btn btn-success btn-sm fa fa-plus-circle", :style => "margin-left: 15px;margin-top: 15px;", :"data-association" => association)
end
def remove_child_link(name, f)
f.hidden_field(:_destroy) + link_to(name, "javascript:void(0)", :style => "height: 30px; margin-left: 5px;", :class => "remove_child btn btn-danger fa fa-close")
end
<%= form_for @task, url: tasks_path, method: :post, :html => {:multipart => true } do |f| %>
<%= f.fields_for :vendor_upload do |ff| %>
<%= ff.fields_for :vendor_shipping_logs do |fff| %>
<%= render "vendor_shipping_log", :f => fff %>
<% end %>
<p><%= add_child_link " Add Customer", :vendor_shipping_logs %></p>
<%= new_child_fields_template f, :vendor_shipping_logs %>
<% end %>
<% end %>
<div id="jstemplates">
<%= yield :jstemplates %>
</div>
<%= f.fields_for :vendor_shipping_log_products do |ff| %>
<%= render "vendor_shipping_log_product", :f => ff %>
<% end %>
<%= new_child_fields_template f, :vendor_shipping_log_products %>
<p><%= add_child_link " Add Product", :vendor_shipping_log_products %></p>
<%= remove_child_link "", f %>
<div class="fields">
<div class="form-group form-group-sm">
<%= f.label :item_id, "Item ID:", class: 'col-sm-3 control-label' %>
<div class="col-sm-9">
<div style="display: inline-flex;">
<%= f.text_field :item_id, class: "form-control" %>
</div>
</div>
</div>
<%= remove_child_link "", f %>
</div>
$(function() {
$('a.add_child').click(function() {
var association = $(this).attr('data-association');
var template = $('#' + association + '_fields_template').html();
var regexp = new RegExp('new_' + association, 'g');
var new_id = new Date().getTime();
$(this).parent().before(template.replace(regexp, new_id));
$()
return false;
});
});
$(function(){
$(document).on("click", 'a.remove_child', function() {
var hidden_field = $(this).prev('input[type=hidden]')[0];
if(hidden_field) {
hidden_field.value = '1';
}
$(this).parents('.fields').hide();
return false;
});
});
$(function() {
$(document).on('click', 'a.add_child', function() {
var association, new_id, regexp, template;
association = $(this).attr('data-association');
template = $('#' + association + '_fields_template').html();
regexp = new RegExp('new_' + association, 'g');
new_id = (new Date).getTime();
$(this).parent().before(template.replace(regexp, new_id));
$();
return false;
});
});