Custom Error Pages in Rails? Custom Error Pages in Rails? ruby-on-rails ruby-on-rails

Custom Error Pages in Rails?


I would suggest using exceptions to render such error pages, so you can use inheritance to group your error messages...

First, declare some (I usually do it in application_controller.rb)

class Error404 < StandardError; endclass PostNotFound < Error404; end

Then add code to ApplicationController to handle them

class ApplicationController < ActionController::Base  # ActionController::RoutingError works in Rails 2.x only.  # rescue_from ActionController::RoutingError, :with => :render_404  rescue_from Error404, :with => :render_404  rescue_from PostNotFound, :with => :render_post_not_found  def render_404    respond_to do |type|       type.html { render :template => "errors/error_404", :status => 404, :layout => 'error' }       type.all  { render :nothing => true, :status => 404 }     end    true  end  def render_post_not_found    respond_to do |type|       type.html { render :template => "errors/shop_not_found", :status => 404, :layout => 'error' }       type.all  { render :nothing => true, :status => 404 }     end    true  endend

This renders errors/error_404 with the errors layout. Should get you started :)

And in your target_controller:

raise PostNotFound unless @post

Edit

Note for Rails 3

for a longer explanation on why ActionController::RoutingError doesn't work for rails 3:Rails 3.0 Exception Handling.

Rails ticket 4444

"If your application relies on engines that extend your app with their own routes, things will break because those routes will never get fired!"


Firstly - have you deleted the file: 'public/500.html' If that file exists, it will override anything else that you try to do.

Secondly, using an explicit "rescue_from" in the controller (as explained in the other comment) - is a good option if you need to fine-tune the response to different kinds of errors.


You most likely get the 500 error because of an application error.Have you checked the log files?

Update:

Are you certain that you are running 2.3.5 and not an older version that happens to be installed? Mongrel should say which version you are running when it starts, otherwise it should say in the config/environment.rb file.

There are some errors in the code that might create the 500 error. I've changed that and also corrected a few other things I think you meant :)

def render_optional_error_file(status_code)  known_codes = ["404", "422", "500"]  status = interpret_status(status_code)  if known_codes.include?(status) # Here it should be status, not status_code (which is a symbol)    render :template => "errors/#{status[0,3]}", :status => status, :layout => 'errors' # No need to mention ".html.erb", you can do it, but it is not necessary since rails will guess the correct format.  else    render :template => "errors/unknown", :status => status, :layout => 'errors'  endenddef local_request?  # This must return false instead of true so that the public viewer is called   # instead of the developer version.  false end