2014-04-21 16 views
6

Utilizzando Rails 4, non posso ottenere rescue_from di lavorare con ActionController::BadRequest:rescue_from che non funziona con ActionController :: BadRequest

application_controller.rb

rescue_from ActionController::BadRequest, with: :raise_bad_request 

    def raise_bad_request 
    render(nothing: true, status: 404) 
    end 
+0

Do you avere altre dichiarazioni di rescue_from? L'ordine conta. –

+0

Sì, ma non sono sicuro di capire come? Ho 3: rescue_from ActionDispatch :: :: remoteip IpSpoofAttackError, con:: ip_spoof_error rescue_from ActionController :: UnknownFormat, con:: raise_not_found rescue_from ActionController :: BadRequest, con:: raise_not_found –

+0

Stesso problema qui, non poteva risolverlo. .. – Dorian

risposta

7

All'interno del controller è possibile utilizzare solo per rescue_from errori che si alzano all'interno del tuo controller (in azioni, viste o filtri).

Sembra che gli incrementi di ActionController::BadRequest prima che il routing passi la richiesta al controller (da qualche parte nello stack del middleware).

È possibile elaborare tali errori se si scrive proprio middleware come questo:

class HandleErrorsMiddleware 

    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    @app.call(env) 
    rescue ActionController::BadRequest 
    ApplicationController.action(:raise_bad_request).call(env) 
    end 
end 

raise_bad_request dovrebbe essere metodo pubblico in ApplicationController

Si dovrebbe aggiungere questo middleware in config/application.rb

config.middleware.insert_before 'ActionDispatch::ParamsParser', 'HandleErrorsMiddleware' 
+1

Grazie, non sono riuscito a capire perché stavo avendo problemi a salvare ActionController :: UrlGenerationError finché non ho trovato questo articolo. Bello sapere come funzionano le cose, grazie. – stephenmurdoch

Problemi correlati