Eliot Sykes
Eliot Sykes

Reputation: 10083

Simplest way to define a route that returns a 404

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

Answers (4)

BookOfGreg
BookOfGreg

Reputation: 3716

Slighly shorter version than the previous answers to 404 any get in one line. get '*_', to: ->(_) { [404, {}, ['']] }

Upvotes: 1

Nevir
Nevir

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

Luke Francl
Luke Francl

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

Omar Qureshi
Omar Qureshi

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

Related Questions