不仅仅是一个简单的嵌套表单

时间:2013-12-08 10:54:19

标签: ruby-on-rails

campaign.rb

class Campaign < ActiveRecord::Base
  has_many :items
  accepts_nested_attributes_for :item
end

item.rb的

class Item < ActiveRecord::Base
  belongs_to :campaign
end

广告系列有2个属性:标题和说明
物品有1个attirubte:名称

我会尝试用文字解释自己,我想创建一个嵌套的表单,用户插入广告系列的名称和说明,但他可以插入多于1个项目,他可以插入一个项目列表(特别是会有是一个“+”按钮,当单击时,将出现一个新的项目行,用户可以插入项目)。
最后,只需点击一个提交按钮即可全部发送。 如何通过rails实现我的目标?

2 个答案:

答案 0 :(得分:0)

来自railscasts.com网站作者的ryanbates提供了一个不错的宝石以及教程。您可以使用this并查看tutorial here

如果你想尝试手写使用fields_for,同时用here这样的形式写一下,并管理一些jquery代码来添加或删除。

答案 1 :(得分:0)

我昨天回答了一个问题。这是链接:Rails accepts_nested_attributes_for with f.fields_for and AJAX

我会写出它的工作原理&amp;提供一些资源,以帮助您提供更多的想法:


如何运作

使用f.fields_for

将关联字段加载到表单中

你会这样做:

#app/views/campaigns/new.html.erb
<%= form_for @campaign do |f| %>
    <%= f.fields_for :items do |a| %>
        <%= a.text_field :information %>
    <% end %>
<% end %>

为了使其工作,在渲染视图之前,必须在后端build关联ActiveRecord对象,如下所示:

#app/controllers/campaigns_controller.rb
def new
    @campaign = Campaign.new
    @campaign.items.build
end

通过Ajax添加额外字段

使用Ajax添加额外字段需要设计新问题的解决方案

您这样做的方法是采用f.fields_for文字&amp;把它放到一个部分。可以从原始视图调用此partial,以及另一个视图(我们可以通过Ajax呈现)

Ajax部分的工作原理基本上是从你的表单中获取请求(ajax请求),然后在你的控制器中使用另一个动作来构建一个新的ActiveRecord对象&amp;渲染另一个包含另一个表单的部分。然后,此部分将调用原始f.fields_for部分,允许您渲染另一个字段

然后,您的Ajax可以提取新字段&amp;将其附加到您的页面。解决id问题(保持ID顺序和唯一ID)的方法是使用child_index方法,并使用Time.now.to_i生成时间戳

如果你阅读了我在这个答案顶部引用的答案,那么所有这些都是有意义的:)

为此提供了一些很好的资源: