как мне обновить и массив пользователей с рельсами 3 - PullRequest
0 голосов
/ 22 января 2011

Я пытаюсь передать массив пользовательских объектов из флэш-памяти в rails 3 и обновить их все сразу.Вот код, который я использую.

  def update_by_fbid
    if params[:users]

     params[:users].each do |u|
       puts u
        user = User.find_by_fbid(u.fbid)
        user.update_attributes(:first_name => u.first_name, :last_name => u.last_name)
      end
    end
    render :json => {:updated_users => true}
  end

Вот мой код из Flash

private function updateUsers(e:Event):void
{
    var users:Array = [{fbid:"93847566", first_name:"Joe", last_name:"Blow"},
        {fbid:"7654321", first_name:"Ronda", last_name:"Smith"}
        ];

    var vars : URLVariables = new URLVariables();
        vars.users = users;

    var request : URLRequest = new URLRequest("http://localhost:3000/update");
    request.method = URLRequestMethod.POST;
    request.data = vars;

    var loader : URLLoader = new URLLoader();
    loader.addEventListener(Event.COMPLETE, registerHandler);
    loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
    loader.load(request);
    }

Вот ошибка, которую я вижу в терминале

Started POST "/update" for 127.0.0.1 at Sat Jan 22 13:41:42 -0600 2011
  Processing by UsersController#update_by_fbid as HTML
  Parameters: {"users"=>"[object Object]"}
Completed   in 8ms

NoMethodError (undefined method `fbid' for "[object Object]":String):
  app/controllers/users_controller.rb:68:in `update_by_fbid'
  app/controllers/users_controller.rb:66:in `each'
  app/controllers/users_controller.rb:66:in `update_by_fbid'

Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms)
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (3.8ms)
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (8.9ms)

Еще немного нового на рельсахпоэтому я уверен, что я просто неправильно выбираю свои объекты из парм или что-то в этом роде.Надеюсь, что кто-то может немного рассказать мне о том, что я делаю неправильно в отношении вещей.

-m

Ответы [ 3 ]

1 голос
/ 23 января 2011

То, что говорит @coreyward, определенно верно.Но я думаю, что ошибка происходит еще раньше.В журнале я вижу:

Parameters: {"users"=>"[object Object]"}

и Rails не ожидает объекты, но хэши, так что-то вроде

Parameters: {"users"=>"[{:first_name => 'Fred', last_name => 'Kruger'}, 
                        {:first_name => "Harrison", :last_name => 'Ford'}]"}

Теперь я не уверен, как вы можете сделать это из флэш-памяти/ прогибается.Преобразовать в JSON?Но я думаю, что именно здесь вы должны начать искать.

[РЕДАКТИРОВАТЬ: обработать JSON]

Ах, я вижу из ваших правок, что вы действительно получаете JSON!Json - это строка в специальном формате.Чтобы работать с этим, вам нужно использовать json драгоценный камень (добавить его к вашему Gemfile), а затем вы можете написать что-то вроде:

rcvd_users = JSON.parse(param[:users])
rcvd_users.each do |u|
  user = User.find_by_fbid(u[:fbid])    
  puts u[:fbid]
  unless user.nil?
    user.update_attributes u
  end
end

Надеюсь, это поможет:)

0 голосов
/ 23 января 2011

Я принял совет @nathanvda, и теперь у меня есть Flash, отправляющий через JSON. Вот что сейчас показывает мой консоль.

Started POST "/updatethem" for 127.0.0.1 at Sat Jan 22 20:11:51 -0600 2011
  Processing by UsersController#update_by_fbid as HTML
  Parameters: {"users"=>"[{\"first_name\":\"Joe\",\"last_name\":\"Blow\",\"fbid\":\"93847566\"},{\"first_name\":\"Ronda\",\"last_name\":\"Smith\",\"fbid\":\"7654321\"}]"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE ("users"."fbid" IS NULL) LIMIT 1
Completed 200 OK in 13ms (Views: 2.4ms | ActiveRecord: 0.2ms)

выполнение puts params[:users] дает мне следующее в консоле

[{"first_name":"Joe","last_name":"Blow","fbid":"93847566"},{"first_name":"Ronda","last_name":"Smith","fbid":"7654321"}]

Это похоже на массив пользователей, который я хотел бы отправить, но выполнение следующего, похоже, не повторяет массив. Rails, похоже, видит params [: users] только как один объект, а не как массив.

params[:users].each do |u|
  user = User.find_by_fbid(u[:fbid])    
    if user.nil?
      puts u[:fbid]
    else
      user.update_attributes u
      puts u[:fbid]
    end
 end
0 голосов
/ 22 января 2011

Вы получаете доступ к fbid, как будто это метод одного из элементов в params[:user]. То, что вы на самом деле хотите, это:

params[:users].each do |u|
  user = User.find_by_fbid(u[:fbid])
  user.update_attributes(:first_name => u[:first_name], :last_name => u[:last_name])
end

Предполагая, что вы НЕ предотвратили массовое присвоение атрибутов first_name и last_name, вы можете упростить то, что вы делаете:

params[:users].each do |u|
  user = User.find_by_fbid u[:fbid]
  user.update_attributes u
end

Просто убедитесь, что у есть предотвращенное массовое присвоение чувствительных атрибутов, например fbid. Вы можете добавить это вверху вашей модели, чтобы сделать это безопасно (белый список):

attr_accessible :first_name, :last_name

Вам следует дважды проверить свой отступ в источнике. В вашем вопросе это немного странно, что может привести к путанице, в которой end соответствует чему.

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