有可能的
这里有一个非常非常好的教程:http : //pikender.in/2013/04/20/child-forms-
using-fields_for-through-ajax-rails-way/
我们最近还在我们的一个开发应用程序中实现了这种形式的表格。如果您转到&http://emailsystem.herokuapp.com,请注册(免费),然后单击“新消息”。“订户”部分使用此技术
顺便说一句,我们手动执行此操作。茧实际上看起来非常好,并且似乎使用与我们相同的原理。还有一个RailsCast,但这仅适用于单个添加项(我认为)
f.fields_for
您的方法是使用一系列局部函数,这些局部函数可动态构建所需的字段。从您的代码看来,您已经具备了基础知识(表单正在运行),因此现在是构建几个组件来处理AJAX请求的情况:
- 您需要在控制器上处理AJAX(路由+控制器操作)
- 您需要将f.fields_for放入partials(以便可以用Ajax调用它们)
- 您需要处理
build
模型中的功能
使用控制器处理AJAX
首先,您需要在控制器中处理Ajax请求
为此,您需要向路由添加一个新的“端点”。这是我们的:
resources :messages, :except => [:index, :destroy] do collection do get :add_subscriber end end
控制器动作然后转换为:
#app/controllers/messages_controller.rb#Ajax Add Subscriberdef add_subscriber @message = Message.build render "add_subscriber", :layout => falseend
添加您的f.fields_for
局部
要处理此问题,您需要将其
f.fields_for放入局部。这是我们表单的代码形式:
#app/views/resources/_message_subscriber_fields.html.erb<%= f.fields_for :message_subscribers, :child_index => child_index do |subscriber| %> <%= subscriber.collection_select(:subscriber_id, Subscriber.where(:user_id => current_user.id), :id, :name_with_email, include_blank: 'Subscribers') %><% end %>#app/views/messages/add_subscriber.html.erb<%= form_for @message, :url => messages_path, :authenticity_token => false do |f| %> <%= render :partial => "resources/message_subscriber_fields", locals: {f: f, child_index: Time.now.to_i} %><% end %>#app/views/messages/new.html.erb<% child_index = Time.now.to_i %><div id="subscribers"> <div >Subscribers</div> <%= render :partial => "message_subscriber_fields", locals: {f: f, child_index: child_index } %></div>将构建功能扩展到模型
为了保持干燥,我们仅
build在模型中创建了一个函数,每次可以调用该函数:
#Build def self.build message = self.new message.message_subscribers.build message end
儿童索引
你最好的朋友是
child_index
如果要添加多个字段,将
[id]面临的最大问题是增加字段的字段(这是我们在Ryan Bates的教程中发现的缺陷)
我发布的第一个教程解决此问题的方法是只使用设置
child_index新字段
Time.now.to_i。这将设置一个唯一的ID,并且由于新字段的实际ID无关紧要,因此您可以根据需要添加任意多个字段
jQuery查询
#Add Subscriber $ -> $(document).on "click", "#add_subscriber", (e) -> e.preventDefault(); #Ajax $.ajaxurl: '/messages/add_subscriber'success: (data) -> el_to_add = $(data).html() $('#subscribers').append(el_to_add)error: (data) -> alert "Sorry, There Was An Error!"


