2015-12-30 14 views
1

我一直在遵循一个非常标准的UJS模型来处理很多AJAX,并且它工作得很好 - 但是有一种情况我不确定最佳实践是什么。我有一个模型,用的has_many关系说:使用UJS在Rails中动态插入多个嵌套form_fields

class User < ActiveRecord::Base 
    has_many :aliases 
    accepts_nested_attributes_for :aliases, :allow_destroy => true 
end 

class Alias < ActiveRecord::Base 
    belongs_to :User 
end 

现在,在我的User对象,新的观点,我希望用户能够点击一个按钮,因为他们喜欢添加尽可能多的别名 - 每次按下按钮时,它触发开了一个控制器动作的远程请求,看起来像这样:

def new_ajax 
     @alias = Alias.new({}) 
     respond_to do |format| 
     format.js 
     end 
    end 

这个回复我new_ajax.js.erb模板看起来像这样:

$('#aliases-container').append('<%= j(render 'ajax_new')%>'); 

WHI CH又将呈现一个模板,看起来像这样:

<%=simple_fields_for @alias do |f|%> 
    <%= f.input :name %> 
<% end %> 

这一切工作,我得到我的别名表单字段渲染 - 但问题是ID和NAME属性没有在嵌套字段正确设置。 ID和别名应该按顺序编号,以便在create方法和错误处理中建立适当的关联。有没有人有解决这个问题?

+0

你知道你的关联应该是小写,对? 'belongs_to:user' –

回答

0

您遇到的问题是添加新的嵌套字段的基本问题。

简单的答案是使用child_index: Time.now.to_i为您的fields_for;但是,您必须在form_for对象内调用它,以便Rails正确创建names等。听起来很复杂,但是当你得到它周围你的头它是相当简单:


#app/controllers/users__controller.rb 
class UsersController < ApplicationController 
    respond_to :js, :html, only: :new 
    def new 
     @user = User.new 
     @user.aliases.build if request.xhr? 
     respond_with @user 
    end 
end 

#app/views/users/new.html.erb 
<%= render "form", locals: {user: @user} %> 

#app/views/users/_form.html.erb 
<%= form_for user do |f| %> 
    <%= f.fields_for :aliases, child_index: Time.now.to_i do |a| %> 
     <%= a.text_field :name %> 
    <% end %> 
<% end %> 

#app/views/users/new.js.erb 
var data = $("<%=j render "users/ajax_new", locals: {user: @user} %>").html(); 
$('#aliases-container').append(data); 

你可以看到一个更基本的实现我在2013年写了回信: Rails accepts_nested_attributes_for with f.fields_for and AJAX