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

时间:2011-04-18 09:42:17

标签: jquery ruby-on-rails ajax

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

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

这有两个阶段:第一个是非ajax相关的,基本上是“我应该如何做一个控制器动作来一次创建/更新多个对象”。自从铁轨发明以来,这一直是一个常见的问题,人们已经以各种方式处理它(google“rails multiple update”)。一旦你有了这个控制器动作,你就可以从普通形式或者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有这种形式(例如,如果您通过名称发送):

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等形式的唯一键来区分不同的散列。无论如何,这是建立params的更好方法,因为它使得它们不太容易以常规形式混合在一起。我们可以通过修改控制器动作来解决这个问题:

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

@user_hashes.each do |user_hash|
...

答案 1 :(得分:0)

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

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