Fangen Unbekannten Aktion in Rails 3 für 404
Will ich fangen unbekannten action-Fehler im Rails 3 ist, die zeigt "Unknown Action" - Fehler, die auf Entwicklung und die 404.html auf die Produktion. Ich habe versucht, diese rescue_from
- handler auf meine ApplicationController (und auch auf dem eigentlichen controller, nur für den Fall), aber ich sehe immer noch das hässliche Fehler.
Habe ich custom Sachen auf die 404, und es kann nicht einfach sein .html-Datei.
Meine route:
match '/user/:id/:action', controller: 'users'
Die URL, die ich aufrufen: /user/elado/xxx
Den rescue_from
code:
rescue_from AbstractController::ActionNotFound, :with => :action_not_found
def action_not_found
render text: "action_not_found"
end
Den Fehler im browser:
Unknown action
The action 'xxx' could not be found for UsersController
Und in der Konsole:
Started GET "/user/elado/xxx" for 127.0.0.1 at 2011-09-07 19:16:27 -0700
AbstractController::ActionNotFound (The action 'xxx' could not be found for UsersController):
Versucht auch rescue_from ActionController::UnknownAction
.
Irgendwelche Vorschläge?
Danke!
InformationsquelleAutor elado | 2011-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
rescue_from war etwas kaputt, wenn Rails 3 kam (noch gebrochen in 3.1). Im Grunde können Sie nicht:
mehr. Sehen hier.
Die Lösung, denn nun ist, was hamiltop empfiehlt. Die Verwendung einer catch-all-Strecke, die geht an Ihre "routing error" - route. Stellen Sie sicher, dass Sie legen es am Ende Ihrer config\Routen.rb-Datei, so dass es zuletzt verarbeitet wird.
Hinweis: Diese Methode hat einen großen Nachteil. Wenn Sie eine engine wie Jammit oder Entwickeln, die fangen alle route machen Schienen ignorieren des Motors Routen.
Wenn Sie nicht mit einem Motor, gibt es eigene Routen, dann sollten Sie in Ordnung sein.
Jedoch, wenn Sie verwenden einen Motor, definiert Ihre eigenen Routen finden Sie unter @arikfr Antwort.
InformationsquelleAutor Seth Jackson
Verwendung einer catch-all route zu handhaben 404 Fehler (wie @Seth Jackson vorgeschlagen) hat einen großen Nachteil: wenn Sie eine Rails-engines, definieren Sie Ihre eigenen Routen (wie Jammit) Ihre Routen werden ignoriert.
Besser und mehr konforme Lösung wäre die Verwendung einer Rack-middleware, die fangen 404-Fehler. In einem meiner Projekte habe ich umgesetzt wie Rack-middleware, meldet diese Fehler zu Hoptoad. Ich habe meine Implementierung basiert auf dieser: https://github.com/vidibus/vidibus-routing_error, aber anstelle von aufrufen meiner Rails-app erneut, um zu behandeln, die 404-Fehler, ich habe es in der Rack-middleware und lassen nginx zu zeigen, die 404-Seite.
InformationsquelleAutor arikfr
Wenn Sie wirklich wollen, zu retten
AbstractController::ActionNotFound
im controller, können Sie versuchen, so etwas wie dieses:Überschreibt dieses die
process
Methode derAbstractController::Base
das wirftAbstractController::ActionNotFound
(siehe Quelle).InformationsquelleAutor Grégoire Clermont
Haben Sie versucht, eine zu fangen alle Weg?
http://railscasts.com/episodes/46-catch-all-route
Den wildcard-route, die Sie verwenden ist eine Schlechte Idee(tm).
Ich würde empfehlen, die Definition der Routen, die Sie interessieren, und dann ein Fangnetz über die Letzte Zeile der Routen.rb (Routen definiert zunächst in Routen.rb trump später-Definitionen). Dann können Sie den render, was auch immer Seite, die Sie wollen (und geben Sie den 404-status-code).
Edit: Wenn Sie wirklich wollen, verwenden Sie Ihren aktuellen Ansatz... (obwohl dies scheint, wie es sein könnte veraltet)
def rescue_action(Ausnahme)
Fall Ausnahme
wenn ActionNotFound, UnknownAction dann
# Griff diese Ausnahmen hier
sonst
super
Ende
Ende
rescue_from
? Es sieht aus wie es funktionieren sollte...Danke, obwohl
def rescue_action(exception); case exception; when ActionController::UnknownAction, AbstractController::ActionNotFound then render text: "404"; else render text: "other exception"; end; end
im ApplicationController oder UsersController hat nicht funktioniert.InformationsquelleAutor hamiltop