2013-02-11 1 views
0

У меня есть объект пользователя, который я получаю данные пользователя из твиттера/facebook, затем нажмите «Сохранить» и, наконец, отправьте user_id и avatar_url в .Создание новой записи базы данных, а затем отправка идентификатора на Resque возвращает nil (идентификатор не найден)

self.save! 

Resque.enqueue(AvatarPull, {user_id: self.id, url: user[:avatar] }) if user[:avatar] and self.avatar.blank? 

Тогда в self.perform я просто использовать найти, чтобы получить пользователя по идентификатору затем установить аватар затем сохранить.

@queue = :paperclip 

def self.perform(options={}) 

    user = User.find(options[:user_id]) 
    user.avatar = URI.parse(options[:url].sub("_normal", "")) 
    user.save! 
end 

Проблема заключается в том, я получаю эту ошибку, что не найти пользователя по идентификатору

(Job{paperclip} | AvatarPull | [{"user_id"=>"51191a5e0eae9cfccf000006", "url"=>"http://source"}]) failed: #<Mongoid::Errors::InvalidFind: 

Problem: 
Calling Document.find with nil is invalid. 

Summary: 
Document.find expects the parameters to be 1 or more ids, and will return a single document if 1 id is provided, otherwise an array of documents if multiple ids are provided. 

Resolution: 
Most likely this is caused by passing parameters directly through to the find, and the parameter either is not present or the key from which it is accessed is incorrect.> 

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

ответ

1

Работы Resque хранятся в виде пакетов JSON. Это означает, что хеш-параметры, которые передаются методу выполнения, теперь имеют ключи, которые являются строками, а не символами. Обратите внимание на кавычки вокруг «user_id» в ошибке. Использование строкового представления ключей должно работать:

user = User.find(options["user_id"])