如何实现远程:没有link_to的真正功能?

如何实现远程:没有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选项一样工作。但在这种情况下没有链接,但在更改事件时需要显示表单。我应该如何实现这一点?

+0

',更改了号码,要显示不同数量的'instances'输入字段?这是否需要AJAX?也许它只是听该单击事件在该网页上追加一个新的div在该网页上,当您提交表单,请确保提交适用于这些领域....我想发布一个答案..添加输入字段是很棘手的,因为表单有一个'token',可以避免CSRF,也可以用'Javascript'来执行提交,你需要创建一个jquery'.post()'请求 –

+0

你的触发器听到点击''so'$('#select_tab')。click(// add input div取决于div .value()的结果);',没有服务器交互。然后,您需要使用此函数在javascript文件中执行'post'请求https://api.jquery.com/jQuery.post/ –

因为instances/form包含只能在服务器端渲染的代码,所以您必须调用服务器端代码。
首先,您必须执行ajax调用(例如instance_new_path),然后您必须在该视图上呈现窗体(instance_new.js.erb)。

例如.js.erb

$("#new_form").html("<%= escape_javascript(render partial: 'instances/form') %>"); 
+0

传递表单对象在这里是棘手的问题(我找到了) - 怎么会你是否可以使用该部分? – SRack

+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'>。另外,你不应该在那里使用form对象,只需在那里使用text_field_tag/checkbox_tag输入。然后,当您需要添加更多的实例时,您只需复制这些隐藏的片段,并根据需要设置专用名称(适用于accepts_nested_attributes_for)。

Ping我提供更多的细节和帮助。这是一个在实际项目中使用的方法。每次需要添加更多实例时,都会调用ajax调用并不是最优化的。

+0

我已经在使用''.. –

+0

您需要将这件作品存储在一些隐藏的模板中,并为每个新实例复制此模板。复制完成后,您需要使用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]

当你点击'@project只需使用宝石https://github.com/nathanvda/cocoon的嵌套形式