JQuery AJAX создать несколько объектов в одном вызове AJAX (для Rails) - PullRequest
0 голосов
/ 18 апреля 2011

Я хочу создавать объекты person в моем приложении rails, используя вызов jquery ajax.Это хорошо для одного вызова для создания одного объекта.Я хотел бы передать массив имен и создать несколько объектов за одну поездку.

Есть идеи?

Спасибо

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Есть два этапа: первый не связан с 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|
...
0 голосов
/ 18 апреля 2011

Я не знаком с ruby-on-rails, но как насчет этого?

Цикл по вашему массиву и создание пар ключ-значение.Ключ, скажем, «имя» - расширенный индексом, а значение - имя человека.Убедитесь, что вы отправляете данные методом post, чтобы у вас было достаточно места для отправки большого количества имен.На сервере прочитайте все параметры и создайте свои объекты, используя цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...