Reputation: 10083
I've got a requirement to specify a named route in a Ruby on Rails project that returns the public/404.html page along with the 404 server response code.
Leaving it blank is not an option, please don't question why, it just is :) It absolutely must be a named route, or a map.connect entry would do.
Something like this would be great:
map.my_named_route '/some/route/', :response => '404'
Anyone have any idea what's the easiest way to do something like this. I could create a controller method which renders the 404.html file but thought there might be an existing cleaner way to do this. Looking forward to any responses - thanks,
Eliot
Upvotes: 27
Views: 14270
Reputation: 3716
Slighly shorter version than the previous answers to 404 any get in one line.
get '*_', to: ->(_) { [404, {}, ['']] }
Upvotes: 1
Reputation: 8101
You can route to a rack endpoint (rails 3) that vends a simple 404:
match 'my/route', to: proc { [404, {}, ['']] }
This is particularly handy, for example, to define a named route to your omniauth endpoint:
match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize
Upvotes: 55
Reputation: 31474
In your routes.rb:
map.my_404 '/ohnoes', :controller => 'foobar', :action => 'ohnoes'
In FoobarController
:
def ohnoes
render :text => "Not found", :status => 404
end
If you need to render the same 404 file as a normal 404, you can do that with render :file
.
See ActionController::Base documentation for examples.
Upvotes: 3
Reputation: 9103
Why dont you do this in Apache/nginx where you use mod_rewrite (or however nginx does rewrites) to link to a non-existent page or instead send a 410 (Gone, no longer exists) Flag?
Anyway, if you want the rails app to do this, I think the way is as you suggested, create a named route to an action that does a render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)
Upvotes: 2