работа со спасением в Rails - PullRequest
12 голосов
/ 02 апреля 2010

Я работаю со следующей частью;

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

Теперь я либо задаю вопрос, есть ли у меня правильный идентификатор или нет, я всегда получаю "ОК", на мой взгляд, что я делаю не так?

Мне нужно это, когда у меня нет идентификатора в БД, чтобы показать «ОШИБКА». Я также пытался использовать rescue ActiveRecord::RecordNotFound, но то же самое происходит.

Вся помощь приветствуется.

Ответы [ 3 ]

33 голосов
/ 02 апреля 2010

Весь код после конца спасательного блока интерпретируется, только если в спасательном блоке нет возвратов. Так что вы можете позвонить в конец вашего спасательного блока.

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

или

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

Но в вашем случае лучше использовать rescue_from или rescue_in_public

как

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

Но использование rescue_in_public не очень хороший совет

4 голосов
/ 20 июня 2014

Просто общий ответ Rails Rescue:

Я нашел это очень круто:

@user = User.find(params[:id])  rescue ""
0 голосов
/ 02 апреля 2010

Если нет user с этим id, то User.find вернет nil. Возвращение nil не является ошибкой и не вызовет rescue.

...