Есть два этапа: первый не связан с AJAX и в основном «как мне выполнить действие контроллера для создания / обновления нескольких объектов одновременно». Это был общий вопрос с момента изобретения рельсов, и люди решали его различными способами (google "rails множественное обновление"). Если у вас есть это действие контроллера, вы можете вызывать его из обычной формы или из запроса ajax, оно не имеет значения.
Итак, нам просто нужно действие контроллера, которое получает некоторые имена и делает пользователей. Я хотел бы сделать это гибким, и сделать так, чтобы данные содержались в массиве в params [: users], каждая запись в массиве была хешем параметров (так же, как params [: user] в обычном create / update звоните)
#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: {: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|
...