Jquery ajax在单个ajax调用中创建多个对象(到Rails)

我想使用jquery ajax调用在rails应用程序中创建person对象。 一次调用一个对象创建就好了。 我想要的是传递一组名字并在一次旅行中创建多个对象。

有任何想法吗?

谢谢

这有两个阶段:第一个是非ajax相关的,基本上是“我应该如何做一个控制器动作来一次创建/更新多个对象”。 这是自铁轨发明以来的常见问题,人们已经以各种方式处理它(谷歌“rails multiple update”)。 一旦你有了这个控制器动作,你就可以从普通forms或者ajax请求中调用它,它实际上并不是特别的。

所以,我们只需要一个控制器动作来获取一些名称并使用户。 我会使它变得灵活,并且让它使数据保存在params [:users]中的数组中,数组中的每个条目都是参数的散列(就像常规创建/更新中的params [:user]一样呼叫)

#needs to be added to your routes as a :post action def multiple_create @users = [] @failed = [] params[:users].each do |user_hash| user = User.new(user_hash) if user.save @users << user else @failed << user end end end 

现在,这将期望params具有此forms(例如,如果您通过名称发送):

params: {:users => [{:name => "Alice"}, {:name => "Bob"}]}

现在您只需要相应地定制ajax查询中的数据。 我不知道数据的来源,因为你没有在你的问题中提供页面的详细信息,但它可能是这样的(让我们假设有一堆输入的名称都有“newUserName”类) :

 //build the array var users = new Array(); $(".newUserName").each(function(){ var user = {"name": $(this).val()}; users.push(user); }); //make the request jQuery.ajax({ async:true, type: "POST", url: ("/users/multiple_create/"), data: {"users": users}, dataType: "script" }); 

虽然,我只测试了这个,而用户中的javascript对象看起来像这样:

[{name:"alice "}, {name:"bob "}, {name:"charlie"}]

,它实际发送的params看起来像这样:

{"users"=>{"0"=>{"name"=>"alice "}, "1"=>{"name"=>"bob "}, "2"=>{"name"=>"charlie"}}}

因此,看起来jquery不希望将数组作为参数发送,而是将其转换为散列,使用0,1,2等forms的唯一键来区分不同的散列。 无论如何,这是更好的方法来建立params,因为它使得它们不太容易以常规forms混合在一起。 我们可以通过修改控制器动作来解决这个问题,如下所示:

 if params[:users].is_a?(Hash) @user_hashes = params[:users].values else @user_hashes = params[:users] end @user_hashes.each do |user_hash| ... 

我不熟悉ruby-on-rails,但这样怎么样?

循环遍历数组并创建键值对。 关键是让我们说“名称” – 由索引扩展 – 值是人名。 确保使用post方法发送数据,这样就可以获得足够的空间来发送大量名称。 在服务器端,通过使用循环读取所有参数并创建对象。