7

我正在将 Rails 4.1.8 应用程序(也使用 rails-api ~> 0.3.1)升级到 4.2.0.rc2,并希望保留该respond_with功能。我已经添加responders到 Gemfile,但是当我bin/rake spec,我得到:

/Users/sloveless/.gem/ruby/2.1.0/gems/actionpack-4.2.0.rc2/lib/action_controller/metal/mime_responds.rb:10:in `respond_to': The controller-level `respond_to' feature has been extracted to the `responders` gem. Add it to your Gemfile to continue using this feature: (NoMethodError)
  gem 'responders', '~> 2.0'
Consult the Rails upgrade guide for details.
    from /Users/sloveless/Development/twilight/app/controllers/application_controller.rb:6:in `<class:ApplicationController>'
    from /Users/sloveless/Development/twilight/app/controllers/application_controller.rb:1:in `<top (required)>'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:274:in `require'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:274:in `block in require'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:274:in `require'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:360:in `require_or_load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:494:in `load_missing_constant'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:184:in `const_missing'
    from /Users/sloveless/Development/twilight/app/controllers/zone_maps_controller.rb:1:in `<top (required)>'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:274:in `require'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:274:in `block in require'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:274:in `require'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:360:in `require_or_load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:494:in `load_missing_constant'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:184:in `const_missing'
    from /Users/sloveless/Development/twilight/spec/controllers/zone_maps_controller_spec.rb:3:in `<top (required)>'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:268:in `load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:268:in `block in load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:268:in `load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `block in load_spec_files'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `each'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `load_spec_files'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:96:in `setup'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:84:in `run'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:69:in `run'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:37:in `invoke'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/rspec-core-3.1.7/exe/rspec:4:in `<top (required)>'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:268:in `load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:268:in `block in load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/activesupport-4.2.0.rc2/lib/active_support/dependencies.rb:268:in `load'
    from /Users/sloveless/.gem/ruby/2.1.0/gems/spring-commands-rspec-1.0.3/lib/spring/commands/rspec.rb:18:in `call'
    from /Users/sloveless/.rubies/ruby-2.1.0/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Users/sloveless/.rubies/ruby-2.1.0/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from -e:1:in `<main>'

任何想法为什么我可能会得到这个?...当然,我该如何绕过它?

相关文件:

# app/application_controller.rb
class ApplicationController < ActionController::API
  include ActionController::MimeResponds
  include ActionController::ImplicitRender
  include SentientController

  respond_to :json

  # (Custom responder)
  self.responder = HTTPErrors::Responder
  before_action :set_locale

  private

  def set_locale
    I18n.locale = http_accept_language.compatible_language_from(I18n.available_locales)
  end
end






# Gemfile
source 'https://rubygems.org'

gem 'rails', '4.2.0.rc2'
gem 'rails-api', '~> 0.3.1'

# Other utils
gem 'uuidtools'

# Serializing things
gem 'active_model_serializers', '~> 0.8.2'

# Persisting things
gem 'pg', '~> 0.17.1'
# gem 'activerecord-postgis-adapter', '~> 2.2.1'
# gem 'redis'

# Controller & routing things
gem 'http_accept_language', '~> 2.0.2'
gem 'kaminari'
gem 'rack-cors', require: 'rack/cors'
gem 'responders', '~> 2.0'

group :development do
  gem 'brakeman', require: false
  gem 'guard-bundler'
  gem 'guard-rails'
  gem 'guard-rspec'
  gem 'guard-rubocop'
  gem 'rails_best_practices'
  gem 'rubocop', require: false
  gem 'quiet_assets'
  gem 'web-console', '~> 2.0'
end

group :development, :test do
  gem 'bullet'
  gem 'byebug'
  gem 'factory_girl_rails'
  gem 'faker'
  gem 'pry-rails'
  gem 'pry-rescue'
  gem 'pry-stack_explorer'
  gem 'rspec-rails'
  gem 'puma'
  gem 'spring'
  gem 'spring-commands-rspec'
end

group :test do
  gem 'json_spec'
  gem 'shoulda-matchers'
end

group :production do
  gem 'newrelic_rpm'
end

编辑:毫不奇怪,这发生在我手动发出请求时,而不仅仅是在测试期间。

4

5 回答 5

13

以下使用rails-api/对我有用active_model_serializers 0.8.3

消除

include ActionController::MimeResponds
include ActionController::ImplicitRender

添加

include ActionController::RespondWith

请参阅github 上的 此讨论。

于 2015-01-12T17:45:11.297 回答
3

ActionController::API为清楚起见,如果控制器继承自并包含在内,则该问题似乎可以重现ActionController::MimeResponds。为了避免控制器级别的错误respond_to,我这样做了:

class ApplicationController < ActionController::API
  include ActionController::MimeResponds

  def self.respond_to(*mimes)
    include ActionController::RespondWith::ClassMethods
  end

  respond_to :json

end

我没有研究如何解决 respond_with 的问题,但它会有点不同,因为它是一个实例方法。

于 2014-12-13T01:48:50.943 回答
1

看起来这是responders/rails-api不兼容。我尝试responders :locationApplicationController并且会得到一个回溯,这让undefined method 'responders' for ApplicationController:Class (NoMethodError)我相信respondersgem 将responders类方法添加到ActionController::Base. 由于rails-api您的控制器继承自ActionController::API,因此这些responders方法实际上不会被添加到我的ApplicationController.

确认:responders/lib/responders/controller_method.rb

我尝试extend了我ApplicationController的 with Responders::ControllerMethod,但这并没有让我解决这个问题。

我的解决方案实际上是放弃使用rails-api, then ApplicationController < ActionController::Base

于 2014-12-11T00:21:38.077 回答
1

如果您的控制器继承自ActionController::Metal您,则可能还需要为include ActionController::RespondWith您添加响应者 gem。

于 2014-12-31T17:37:27.790 回答
0

我刚刚在我的 gemfile 中添加了 gem responder,做了一个 bundle install,然后我做了一个 rails generate responder:install 并安装了文件。之后,我运行我的 rails generate scaffold food name:stringcalories:float 并在 db:drop db:create 和 db:migrate (删除并刷新数据库)之后停止出错。

基本上,当我在运行 rails 之前安装 gems 和文件时,无论它开始工作,它都会生成脚手架。

于 2017-10-03T22:29:44.433 回答