# If else statments for errors within controller methods

**URL:** <https://www.ruby-forum.com/t/if-else-statments-for-errors-within-controller-methods/162896>\
**Category:** Rails\
**Created:** [March 15, 2009, 6:47am UTC](https://www.ruby-forum.com/t/if-else-statments-for-errors-within-controller-methods/162896 "2009-03-15T06:47:24Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [March 15, 2009, 6:47am UTC](https://www.ruby-forum.com/t/if-else-statments-for-errors-within-controller-methods/162896/1 "2009-03-15T06:47:24Z")

</div>

When I first started learning ruby on rails I wrote my controller  
actions by using if else statements to display error messages in case  
something failed a validation. Like:

if @user.save  
flash[:notice] = “User was saved”  
redirect\_to whatever  
else  
flash[:error] = “There was an error saving the user”  
end

Im trying to use the beast forum plugin and in the controller actions  
there are no if else statements and it looks really clean. like it  
just has:

def create  
@forum.attributes = params[:forum]  
@forum.save!  
…  
end

Im wondering, does it just rely on validations for the error  
handling? And if so, is this good practice?

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [March 15, 2009, 6:59am UTC](https://www.ruby-forum.com/t/if-else-statments-for-errors-within-controller-methods/162896/2 "2009-03-15T06:59:05Z")

</div>

David wrote:

> Im wondering, does it just rely on validations for the error  
> handling? And if so, is this good practice?

The second one is user-hostile.

Roughly speaking, all tests, and some low-level code, should use save!.  
That  
raises an error, which you ought to rescue.

The first example does not raise, and it does tell the user something  
went  
wrong. However…

The best version tells the user what model’s .errors collection now  
holds. The  
first example may have put the correct code to do that, in the View,  
under where  
it probably output the flash[:error].

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [March 16, 2009, 12:37pm UTC](https://www.ruby-forum.com/t/if-else-statments-for-errors-within-controller-methods/162896/3 "2009-03-16T12:37:03Z")

</div>

Also, the redirects when saving/updating a model generally change. If  
something went wrong, then you (usually) want to redirect to an edit/  
mew page whilst if it actually saved it you want to go to the show.  
Now this is not always true and with (for example) some models you are  
going to go to the same page in both cases.

Nevertheless, the second way (no if…else…) you will have tor escue  
the exception that can be thrown if the model is invalid. this will  
have to be done in ApplicationController, and you would need to  
abstract all as one method (or call a method depending on request.path  
which is a bad bad idea) so you would have really unusefull error  
messages like “something went wrong”)
