2014-04-21 17 views
6

Korzystanie Szyny 4, nie mogę dostać rescue_from pracować ActionController::BadRequest:rescue_from nie pracuje z ActionController :: BadRequest

application_controller.rb

rescue_from ActionController::BadRequest, with: :raise_bad_request 

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

Czy mieć inne instrukcje rescue_from? Zamów sprawy. –

+0

Mam, ale nie jestem pewien, czy rozumiem jak? Mam 3: rescue_from ActionDispatch :: RemoteIp :: IpSpoofAttackError, z:: ip_spoof_error rescue_from ActionController :: UnknownFormat, z:: raise_not_found rescue_from ActionController :: BadRequest, z:: raise_not_found –

+0

Ten sam problem tutaj, nie mógł go rozwiązać. .. – Dorian

Odpowiedz

7

Wewnątrz kontrolera można użyć tylko dla rescue_from błędy, które pojawiają się wewnątrz kontrolera (w akcjach, widokach lub filtrach).

Wygląda na to, że przed routingiem przekazuje żądanie do kontrolera (gdzieś w stosie oprogramowania pośredniczącego) pod numer ActionController::BadRequest.

można przetwarzać takie błędy, jeśli piszesz własny middleware takiego:

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 powinna być metoda publicznego w ApplicationController

Należy dodać ten middleware w config/application.rb

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

Dzięki, nie mogłem dowiedzieć się, dlaczego miałem problemy z ratowaniem ActionController :: UrlGenerationError, dopóki nie znalazłem tego artykułu. Miło wiedzieć, jak to działa, dzięki. – stephenmurdoch