2014-12-10 1 views
6

Sto aggiornando un'applicazione Rails 4.1.8 (utilizzando anche rails-api ~> 0.3.1) a 4.2.0.rc2 e desidero mantenere la funzionalità respond_with. Ho aggiunto responders al Gemfile, ma quando ho bin/rake spec, ottengo:Perché i rispondenti di Rails 4.2 + continuano a dirmi di aggiungere responder al Gemfile?

/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>' 

Tutte le idee perché potrei essere ottenendo questo? ... e, naturalmente, come posso aggirarlo?

file pertinente:

# 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 

Modifica: Per non è una sorpresa, questo accade quando faccio manualmente una richiesta, non solo durante il test.

risposta

13

Di seguito ha lavorato per me usando rails-api/active_model_serializers 0.8.3:

Rimuovere

include ActionController::MimeResponds 
include ActionController::ImplicitRender 

Aggiungi

include ActionController::RespondWith 

Vedi this discussion su github.

+0

Questo ha funzionato per me nonostante queste righe fossero completamente in un altro controller: erano in un controller API in 'controller/api/api_controller.rb'. –

+0

Questo funziona per me con * alcune * app, ma non tutte. Non posso ancora dire con certezza quale sia il denominatore comune, ma questa sembra essere la risposta giusta. – turboladen

+0

Questa soluzione non funziona se hai bisogno del livello di istanza 'reply_to', che è dichiarato solo in ActionController :: MimeResponds – Aymeric

1

Sembra che fosse una incompatibilità responders/rails-api. Ho provato responders :location nel ApplicationController e otterrei un backtrace con undefined method 'responders' for ApplicationController:Class (NoMethodError), portandomi a credere che la gemma responders aggiungesse il metodo di classe responders a ActionController::Base. Dal momento che il rails-api ha ereditato i controller da ActionController::API, i metodi responders non sono, in effetti, aggiunti al mio ApplicationController.

Confermato: responders/lib/responders/controller_method.rb

ho cercato extend ing mia ApplicationController con Responders::ControllerMethod, ma che non mi ha di aggirare il problema.

La mia soluzione, in effetti, era di cadere utilizzando rails-api, quindi ApplicationController < ActionController::Base.

3

Per maggiore chiarezza, sembra che il problema possa essere riprodotto se il controller eredita da ActionController::API e ActionController::MimeResponds è incluso. Per evitare l'errore con il regolatore di livello respond_to, ho fatto questo:

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

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

    respond_to :json 

end 

Non ho guardato a come risolvere il problema per respond_with, ma sarebbe un po 'diverso in quanto è un metodo di istanza.

+0

Questo ha funzionato per me! Grazie! –

1

Se il controller eredita da ActionController::Metal potrebbe anche essere necessario include ActionController::RespondWith dato che è stata aggiunta la gemma responder.

-1

Si sta utilizzando il metodo classe respond_to (respond_to :json) nel controller, che è stato rimosso dal nucleo di rails in Rails 4.2.

In base alle guide di aggiornamento di Rails, il metodo respond_to di livello classe è stato rimosso e ora è disponibile solo tramite la gemma responders.I metodi a livello di istanza respond_with sono ancora disponibili e non stanno andando ovunque per ora.

Non è necessario includere alcun modulo o estendere il controller. Basta installare la gemma responders se si desidera utilizzare respond_to nella classe controller e dichiarare che risponde solo a determinati tipi di contenuto.

Questo rails guide to upgrading section 3.2 Responders fornirà ulteriori dettagli.

esempio:

class UsersController < ApplicationController 

    # this is the class method and requires `responders` gem 
    respond_to :html, :json 

    def show 
    @user = User.find(params[:id]) 
    # you can still use this -- you don't need the gem 
    respond_with @user 
    end 
end 
+0

Erm, ho dichiarato nella seconda frase della mia domanda che sto già utilizzando il gemma 'responder' - da qui la domanda. – turboladen

+0

E cosa succede quando richiedi "responder" nella parte superiore del tuo controller. Ovviamente dovrebbe essere richiesto già all'avvio dell'applicazione. Ma se lo richiedi manualmente e fallisce, sarebbe indicativo che tu non abbia effettivamente caricato la gemma. Sembra che tu stia usando 'spring' pure. Ciò richiede un riavvio quando si modifica l'installazione gemfile/bundle? – jbielick

+0

Ho interrotto la primavera, ho richiesto la gemma nel controller e succede la stessa cosa. – turboladen

0

Ho appena aggiunto risponditore gemma alla mia Gemfile ha installato un pacco e poi ho fatto un rotaie generano risponditore: installare e che ha installato il file. Dopo che ho eseguito il mio rail, ho creato il nome dell'alimento scaffold: string calorie: float e dopo db: drop db: create e db: migrate (ha abbandonato e aggiornato il database) Ho smesso di ricevere errori.

Fondamentalmente quando ho installato le gem e i file prima di eseguire i binari generare scaffold qualsiasi ha iniziato a funzionare.