Сбой в Ruby on Rails с неопределенным методом bytesize при выполнении из delayed_job

Я использую комбо из omniauth а также delayed_job интегрировать с фейсбуком. у меня есть Authentication модель, которая выглядит примерно так:

class Authentication < ActiveRecord::Base

  def account
    @account ||= FbGraph::User.me(token)
  end

  def post_to!(opts = {})
    account.feed!(opts)
  end

end

Итак, из консоли я могу сделать что-то вроде этого:

auth.post_to :message => 'Foo bar', :link => 'http://google.com'

... и все работает отлично, и на моем фиде в Facebook выложено обновление.

Тем не менее, в приложении я создал пользовательское отложенное задание, которое выполняет точно указанное выше, только оно каждый раз завершается ошибкой со следующим стеком ошибок:

undefined method `bytesize'' for nil:NilClass
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/activesupport-3.1.3/lib/active_support/whiny_nil.rb:48:in `method_missing''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:830:in `block in escape''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/activesupport-3.1.3/lib/active_support/core_ext/string/output_safety.rb:142:in `gsub''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/activesupport-3.1.3/lib/active_support/core_ext/string/output_safety.rb:142:in `gsub''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:829:in `escape''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:822:in `block in escape_query''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:818:in `each''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:818:in `collect''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:818:in `escape_query''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:809:in `create_query_part_str''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:538:in `set_content''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:447:in `init_request''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient/http.rb:705:in `new_request''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient.rb:997:in `create_request''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient.rb:866:in `do_request''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient.rb:756:in `request''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/httpclient-2.2.4/lib/httpclient.rb:666:in `post''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/fb_graph-2.4.7/lib/fb_graph/node.rb:55:in `block in post''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/fb_graph-2.4.7/lib/fb_graph/node.rb:122:in `handle_response''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/fb_graph-2.4.7/lib/fb_graph/node.rb:54:in `post''
  /Users/aaron/.rvm/gems/ruby-1.9.2-p290@bb/gems/fb_graph-2.4.7/lib/fb_graph/connections/feed.rb:15:in `feed!''
  /Users/aaron/Sites/bb/app/models/authentication.rb:40:in `post_to!''
  /Users/aaron/Sites/bb/lib/share_activity_job.rb:39:in `block in perform''
  /Users/aaron/Sites/bb/lib/share_activity_job.rb:11:in `each''
  /Users/aaron/Sites/bb/lib/share_activity_job.rb:11:in `perform''

Я официально дошел до того, что начал выбрасывать дорогие компьютеры в окно. Может кто-нибудь предложить какое-либо понимание относительно того, почему это происходит сбой, почему он работает, когда выполняется из консоли, но не работает, когда выполняется из пользовательского delayed_job?

Любая помощь с благодарностью. Спасибо.

1 ответ

Решение простое. Вы должны использовать to_str в вашем коде:

auth.post_to message: message.to_str, link: 'http://google.com'
Другие вопросы по тегам