【问题标题】:Jquery ajax create multiple objects in single ajax call (to Rails)Jquery ajax 在单个 ajax 调用中创建多个对象(对 Rails)
【发布时间】:2011-04-18 09:42:17
【问题描述】:

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

有什么想法吗?

谢谢

【问题讨论】:

  • 您是否尝试为每个对象调用从服务器获取数据。您能解释一下吗?
  • 嗨@GStenson,你能解释一下吗:D

标签: jquery ruby-on-rails ajax


【解决方案1】:

这有两个阶段:第一个阶段与 ajax 无关,基本上是“我应该如何执行控制器操作来一次创建/更新多个对象”。自 Rails 发明以来,这一直是一个常见问题,人们已经以各种方式处理它(谷歌“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 =&gt; [{:name =&gt; "Alice"}, {:name =&gt; "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"}]

,它实际发送的参数如下所示:

{"users"=&gt;{"0"=&gt;{"name"=&gt;"alice "}, "1"=&gt;{"name"=&gt;"bob "}, "2"=&gt;{"name"=&gt;"charlie"}}}

因此,jquery 似乎不想将数组作为参数发送,而是将其转换为散列,并使用 0、1、2 等形式的唯一键来区分不同的散列。老实说,无论如何,这是建立参数的更好方法,因为它使将它们以常规形式混合在一起变得不那么容易。我们可以通过如下修改控制器动作来解决这个问题:

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

@user_hashes.each do |user_hash|
...

【讨论】:

  • 这看起来不错。稍后将完全实施并让您知道。谢谢!
  • 刚刚完成了这个,你或多或少就对了。干杯
【解决方案2】:

我不熟悉 ruby​​-on-rails 但是这种方式怎么样?

循环遍历您的数组并创建键值对。关键是让我们说'name' - 由索引扩展 - 而值是人名。确保您使用 post 方法发送数据,以便您有足够的空间来发送大量名称。 在服务器端,使用循环读取所有参数并创建对象。

【讨论】:

  • 感谢记者 - 我稍后会考虑这样做并告诉你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 2012-11-21
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
相关资源
最近更新 更多