How do you issue a 404 response from a rails controller action?

Viewed 33881

What's the preferred way to issue a 404 response from a rails controller action?

7 Answers

This seems good...

# Rails 2 and below
render :file => "#{RAILS_ROOT}/public/404.html",  :status => 404

# Rails 3 and up
render :file => "#{Rails.root}/public/404.html",  :status => 404

You can also

raise ActiveRecord::RecordNotFound

exception.

Reference:

render :file => '/path/to/some/filenotfound.rhtml', 
                status => 404, :layout => true

In the ApplicationController define a method like:

def render_404
  render :file => "#{RAILS_ROOT}/public/404.html",  :status => 404
end

In Rails 5 you can use

head 404

This will set the response code of your action to 404. If you immediately return after this from your action method, your action will respond 404 with no actual body. This may be useful when you're developing API endpoints, but with end user HTTP requests you'll likely prefer some visible body to inform the user about the error.

If you wanted to issue a status code on a redirect (e.g. 302), you could put this in routes.rb:
get "/somewhere", to: redirect("/somewhere_else", status: 302).
However, this would only work for redirection, not straight up loading a page.

Related