2009-07-16 10 views
20

Ich muss eine benannte Route in einem Ruby on Rails-Projekt angeben, die die öffentliche Seite/404.html zusammen mit dem 404-Server-Antwortcode zurückgibt.Einfachste Möglichkeit, eine Route zu definieren, die eine 404 zurückgibt

Es leer zu lassen ist keine Option, bitte nicht in Frage, warum, es ist einfach :) Es muss unbedingt eine benannte Route sein, oder ein map.connect-Eintrag würde tun.

So etwas wäre toll:

map.my_named_route '/some/route/', :response => '404'

Wer noch keine Ahnung, was der einfachste Weg ist, so etwas zu tun. Ich könnte eine Controller-Methode erstellen, die die 404.html-Datei rendert, aber dachte, es könnte eine existierende sauberere Möglichkeit geben, dies zu tun. Wir freuen uns auf alle Antworten - danke,

Eliot

Antwort

39

Sie können Route zu einem Rack-Endpunkt (Schienen 3), die eine einfache vends 404:

match 'my/route', to: proc { [404, {}, ['']] } 

Dies ist besonders praktisch, beispielsweise eine benannte Route zu Ihrem omniauth endpoint zu definieren:

match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize 
+0

Dies ist ein guter Ansatz für jede Antwort, die keinen Controller benötigt. Es ist immer noch weniger effizient als in Apache/nginx. – mmell

+7

Verwenden Sie in Rails 4 die Option: to, z. 'get '/ apple-touch * str', um: proc {[404, {}, ['']]}' – mmell

+1

@mmell Das wird nicht funktionieren, du musst das tun: 'get '/: str' , zu: proc {[404, {}, ['']]}, Einschränkungen: {str:/apple-touch. * /} ' – Amala

2

Warum nicht tun Sie dies in Apache/nginx, wo Sie mod_rewrite (oder aber nginx Neufassungen der Fall ist) auf eine nicht existierende Seite verlinken oder stattdessen eine 410 schicken (Gegangen, existiert nicht mehr) Flagge?

Wie auch immer, wenn Sie die Schienen app, dies zu tun wollen, ich denke, die Art und Weise ist, wie Sie vorgeschlagen, eine benannte Route zu einer Aktion erstellen, die eine tut render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)

3

In Ihrem routes.rb:

map.my_404 '/ohnoes', :controller => 'foobar', :action => 'ohnoes' 

In FoobarController:

def ohnoes 
    render :text => "Not found", :status => 404 
end 

Wenn Sie die gleiche 404-Datei als eine normale 404 machen, dann können Sie mit render :file das tun.

Siehe Dokumentation ActionController::Base für Beispiele.

1

Etwas kürzere Version als die vorherigen Antworten auf 404 in einer Zeile. get '*_', to: ->(_) { [404, {}, ['']] }

Verwandte Themen