Handling errors - incorrect value entered in url


#1

I have many “edit” actions in my project. If the url is like
http://localhost/project/3/edit and someone enters
http://localhost/project/3333333/edit the edit action will fails because
it cannot find a project with id of 3333333.

To combat this I am adding to every action like edit:

rescue
redirect_to :action => ‘index’
flash[‘errors’] = “That project cannot be edited.”

This works, however is there a way to do this globally or do I have to
entered this for every action that could error in this way? I understand
about using routes to narrow down what URL’s can be typed, but this does
not escape an error when a value entered is incorrect.

Incidentally, I looked at the Typo code and could not see any error
checking, not a rescue in sight. How do they do it in typo?


#2

On Apr 28, 2006, at 3:59 AM, James W. wrote:

flash[‘errors’] = “That project cannot be edited.”
This works, however is there a way to do this globally or do I have to
entered this for every action that could error in this way? I
understand
about using routes to narrow down what URL’s can be typed, but this
does
not escape an error when a value entered is incorrect.

You could have a before_filter call a function that tests that the id
in your URL is valid. If you also want to verify that the right
person is attempting to edit it… you could do that there as well.

Hope that helps.

Cheers,

-Robby

Robby R.
Founder & Executive Director

PLANET ARGON, LLC
Ruby on Rails Development, Consulting & Hosting


www.robbyonrails.com

+1 503 445 2457
+1 877 55 ARGON [toll free]
+1 815 642 4968 [fax]


#3

Also check out the wonderful exception_notification plugin for ideas as
to
how you can use this to better suit your needs.


#4

James, take a look at this:

http://rubyonrails.org/api/classes/ActionController/Rescue.html#M000069

Implement the ‘rescue_action_in_public’ method in your controller (or in
application.rb) to define behavior based on a common exception. You
could
display a 404, or whatever you want.