我正在尝试实现嵌套模型,这里是路径文件条目:
resources :projects do
resources :instances
end
以下是项目控制器的代码段:
# GET /projects/new
def new
@project = Project.new
@project.instances.build
end
和项目的表单视图:
<%= simple_form_for(@project) do |f| %>
...
<%= label_tag :instance_count, "Instance Count" %>
<%= select_tag :instance_count, options_for_select([0, 1, 2, 3, 4, 5], 0) %>
...
<% end %>
现在,当我更改实例计数时,我需要在上面的表单下面多次显示实例字段。以下是部分代码:
<%= form.simple_fields_for :instances do |i| %>
...
<% end %>
基本上我需要从项目的javascript文件中调用<%= render 'instances/form', form: f %>
。它应该像remote: true
选项的链接一样工作。但在这种情况下没有链接,但在更改事件时需要显示表单。我该如何实现呢?
答案 0 :(得分:0)
您必须先调用服务器端代码,因为instances/form
包含只能在服务器端呈现的代码
首先,您必须执行ajax调用(例如instance_new_path),然后您必须在该视图上呈现表单(instance_new.js.erb
)。
例如.js.erb
$("#new_form").html("<%= escape_javascript(render partial: 'instances/form' ) %>");
答案 1 :(得分:0)
标准是部分调用app/views/instances/_instance_fields.html.erb
。然后你可以将它加载到表单中并隐藏它。
<%= simple_form_for(@project) do |f| %>
<%= render 'instances/_instance_fields %>
<% end %>
使用某种容器覆盖_instance_fields
部分,例如<fieldset class='instance_fields' style='display:none'>
。此外,您不应该在那里使用表单对象,只需在那里使用text_field_tag / checkbox_tag输入。然后,当您需要添加更多实例时,您只需根据需要复制此隐藏的片段,并为输入设置适当的名称(适用于accepts_nested_attributes_for
)。
请允许我提供更多详细信息和帮助。这是一种在实际项目中使用的方法。每次需要添加更多实例时,都不会对ajax调用进行优化。
答案 2 :(得分:0)
我建议您使用https://github.com/nathanvda/cocoon
或者你可以使用类似的aproach:初始形式渲染部分(使用display:none),然后使用js删除并保存部分字段,并在选择器被命中时克隆它们。
答案 3 :(得分:0)
创建一个.js
文件,并将其加载到projects/new.html.erb
内,只要select
值发生更改,该文件就会执行,并向{{1}创建post
请求每次被击中时都会呈现instances/new
的控制器。
instances/new.js.erb
实例/ new.js.erb
# GET /instances/new
def new
@f = Instance.new
end
load.js
$('#instance-form-wrapper').append(<% escape_javascript(render 'instances/form', form: @f) %>
虽然你应该不这样使用。而是在代码中已加载一个$(document).on('change', 'select#some-id-name', function(){
var v = $(this).val();
$('#instance-form-wrapper').html('') ;
while(v--) $.post('/instances/');
})
字段,将其隐藏起来,因为instance
中已有instance
个可用字段。此外,每次渲染时都不需要任何新数据。只需选择值1,您就可以project
show
字段,如果值为instance
,则可以使用clone
进一步复制。
答案 4 :(得分:0)
只需将gem https://github.com/nathanvda/cocoon用于嵌套表单
即可