work with rescue in Rails
Asked Answered
P

3

13

I am working with the following piece;

def index
  @user = User.find(params[:id]) 
  rescue
    flash[:notice] = "ERROR"
    redirect_to(:action => 'index')
  else 
    flash[:notice] = "OK"
    redirect_to(:action => 'index')
end

Now I either case whether I have a correct ID or not, I am always getting "OK" in my view, what am I doing wrong?

I need that when I have no ID in the DB to show "ERROR". I have also tried to use rescue ActiveRecord::RecordNotFound but same happens.

All help is appreciated.

Photothermic answered 2/4, 2010 at 14:28 Comment(1)
Is this actual code from your app? As it stands it looks like you are redirecting back to the same action (index) which will result in an infinite loop.Apostles
P
38

All code after the end of the rescue block is interpreted only if there are no returns in the rescue block. So you can call return at the end of your rescue block.

def index
  begin
    @user = User.find(params[:id]) 
  rescue
    flash[:notice] = "ERROR"
    redirect_to(:action => 'index')
    return
  end
  flash[:notice] = "OK"
  redirect_to(:action => 'index')
end

or

def index
  @user = User.find(params[:id]) 
  # after is interpret only if no exception before
  flash[:notice] = "OK"
  redirect_to(:action => 'index')
rescue
  flash[:notice] = "ERROR"
  redirect_to(:action => 'index')
end

But in your case the better is to use rescue_from or rescue_in_public

like

class UserController < ApplicationController
  def rescue_in_public(exception)
    flash[:notice] = "ERROR"
    redirect_to(:action => 'index')
  end

  def index
    @user = User.find(params[:id]) 
    flash[:notice] = "OK"
    redirect_to(:action => 'index')
  end
end

But the using of rescue_in_public is not really good advice

Prolegomenon answered 2/4, 2010 at 14:41 Comment(0)
D
5

Just an overall Rails Rescue answer:

I found this to be very cool:

@user = User.find(params[:id])  rescue ""
Donor answered 20/6, 2014 at 9:20 Comment(0)
F
-5

If there is no user with that id, then User.find will return nil. Returning nil is not an error case and will not trigger a rescue.

Ferrel answered 2/4, 2010 at 14:31 Comment(2)
I am pretty sure this is not right. find with an invalid ID will raise ActiveRecord::RecordNotFound. If you use one of the dynamic finders e.g. User.find_by_name with a value that doesn't match a record then that will return nil. See api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263Apostles
Well sir, I checked and you are correct. Thank you. The find call in the OP should actually raise, unless the code is actually User.find(:first, params[:id]).Ferrel

© 2022 - 2024 — McMap. All rights reserved.