如何在没有link_to的情况下实现远程:true功能?

时间:2017-10-13 15:47:59

标签: javascript ruby-on-rails simple-form

我正在尝试实现嵌套模型,这里是路径文件条目:

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

5 个答案:

答案 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用于嵌套表单

即可