这有两个阶段:第一个阶段与 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 => [{: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"}]
,它实际发送的参数如下所示:
{"users"=>{"0"=>{"name"=>"alice "}, "1"=>{"name"=>"bob "}, "2"=>{"name"=>"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|
...