API коммерции Airbrake и Spree: неопределенный метод `airbrake_request_data`

Я использую Airbrake, чтобы уведомлять меня об ошибках в моем магазине Spree Commerce. Теперь, когда я хочу использовать API spree, я получаю следующую ошибку при попытке опубликовать http://localhost:3000/api/products создать новый продукт:

NoMethodError (undefined method `airbrake_request_data' for #<Spree::Api::V1::ProductsController:0x007f9fcdb81b58>):
  activesupport (3.2.9) lib/active_support/core_ext/object/try.rb:36:in `try'
  airbrake (3.1.11) lib/airbrake/rails/middleware.rb:46:in `request_data'
  airbrake (3.1.11) lib/airbrake/rails/middleware.rb:39:in `notify_airbrake'
  airbrake (3.1.11) lib/airbrake/rails/middleware.rb:15:in `rescue in call'
  airbrake (3.1.11) lib/airbrake/rails/middleware.rb:12:in `call'
  actionpack (3.2.9) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
  actionpack (3.2.9) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.9) lib/rails/rack/logger.rb:32:in `call_app'
  railties (3.2.9) lib/rails/rack/logger.rb:16:in `block in call'
  activesupport (3.2.9) lib/active_support/tagged_logging.rb:22:in `tagged'
  railties (3.2.9) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.9) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.5) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.5) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.9) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.5) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.9) lib/action_dispatch/middleware/static.rb:62:in `call'
  airbrake (3.1.11) lib/airbrake/user_informer.rb:16:in `_call'
  airbrake (3.1.11) lib/airbrake/user_informer.rb:12:in `call'
  railties (3.2.9) lib/rails/engine.rb:479:in `call'
  railties (3.2.9) lib/rails/application.rb:223:in `call'
  rack (1.4.5) lib/rack/content_length.rb:14:in `call'
  railties (3.2.9) lib/rails/rack/log_tailer.rb:17:in `call'
  rack (1.4.5) lib/rack/handler/webrick.rb:59:in `service'
  /usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'


  Rendered /usr/local/rvm/gems/ruby-1.9.3-p392@system/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.3-p392@system/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (16.6ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.3-p392@system/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (55.2ms)

Очевидно, что в моем звонке произошла ошибка. Но я хочу знать, какая ошибка. И, конечно же, Airbrake также должен сообщать об ошибках из API. Я настроил Airbrake со Spree так:

Gemfile

gem "airbrake"

initializers/airbrake.rb

Airbrake.configure do |config|
  config.api_key = 'XXXXXXXXXXXXXXXXXXX'
end

Итак, простая настройка. Я использую Spree 1-2-stable, и я понятия не имею, с чего начать, чтобы решить эту проблему.

1 ответ

Решение

Вы сталкиваетесь с этой ошибкой, потому что Spree API расширяет ActionController::Metal вместо ActionController::Base.

Драгоценный камень воздушного тормоза выполняет некоторую логику, показанную здесь: https://github.com/airbrake/airbrake/blob/68543097a8731cf1f3e717946bd5ed33e5edccad/lib/airbrake/rails.rb#L13

который включает методы в ActionController::Base.

У вас есть несколько вариантов, как обойти это:

  1. Загрузите методы в ActionController::Metal, используя метод, аналогичный тому, который показан в геме airbrake
  2. Загрузите методы в Spree::Api::BaseController, используя аналогичный метод
  3. Украсьте Spree::Api::BaseController, чтобы включить методы напрямую

Это должно помочь вам.

Другие вопросы по тегам