如何实现远程:没有link_to的真正功能?
我想实现嵌套模型,这里是路线文件条目:如何实现远程:没有link_to的真正功能?
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
选项一样工作。但在这种情况下没有链接,但在更改事件时需要显示表单。我应该如何实现这一点?
因为instances/form
包含只能在服务器端渲染的代码,所以您必须调用服务器端代码。
首先,您必须执行ajax调用(例如instance_new_path),然后您必须在该视图上呈现窗体(instance_new.js.erb
)。
例如.js.erb
$("#new_form").html("<%= escape_javascript(render partial: 'instances/form') %>");
传递表单对象在这里是棘手的问题(我找到了) - 怎么会你是否可以使用该部分? – SRack
这必须在控制器上完成,也可以在完整的代码提供之后进行专门化。 –
标准是使部分称为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'>
。另外,你不应该在那里使用form对象,只需在那里使用text_field_tag/checkbox_tag输入。然后,当您需要添加更多的实例时,您只需复制这些隐藏的片段,并根据需要设置专用名称(适用于accepts_nested_attributes_for
)。
Ping我提供更多的细节和帮助。这是一个在实际项目中使用的方法。每次需要添加更多实例时,都会调用ajax调用并不是最优化的。
我已经在使用''.. –
您需要将这件作品存储在一些隐藏的模板中,并为每个新实例复制此模板。复制完成后,您需要使用javascript帮助设置正确的名称。正确的一些具体的笔记什么不是在我给你的方法中工作。你不应该使用'from'属性。在模板的情况下它绝对没用,因为你仍然需要在javascript中手动处理输入'name'属性 – AntonTkachov
我建议你使用https://github.com/nathanvda/cocoon
或者你也可以使用类似的形式给出:呈现在最初的形式部分(与显示:无),然后取出并保存部分领域用js和克隆它们形成时选择被击中。
创建.js
文件,并加载它里面projects/new.html.erb
,每当有select
值的变化产生了post
请求instances/new
控制器,将在每次被击中时呈现instances/new.js.erb
将执行。
# GET /instances/new
def new
@f = Instance.new
end
实例/ new.js.erb
$('#instance-form-wrapper').append(<% escape_javascript(render 'instances/form', form: @f) %>
负载。JS
$(document).on('change', 'select#some-id-name', function(){
var v = $(this).val();
$('#instance-form-wrapper').html('') ;
while(v--) $.post('/instances/');
})
但应这样不使用。在您的代码中已加载一个instance
字段,请将其隐藏,因为您的project
中已有instance
。另外,每次渲染时都不需要任何新数据。只需选择值1,您可以show
您的instance
字段,如果值为> 1
,则可以使用clone
进一步复制它。 [:instance_count]
',更改了号码,要显示不同数量的'instances'输入字段?这是否需要AJAX?也许它只是听该单击事件在该网页上追加一个新的div在该网页上,当您提交表单,请确保提交适用于这些领域....我想发布一个答案..添加输入字段是很棘手的,因为表单有一个'token',可以避免CSRF,也可以用'Javascript'来执行提交,你需要创建一个jquery'.post()'请求 –
你的触发器听到点击''so'$('#select_tab')。click(// add input div取决于div .value()的结果);',没有服务器交互。然后,您需要使用此函数在javascript文件中执行'post'请求https://api.jquery.com/jQuery.post/ –