работа с спасением в Rails

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

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, но происходит то же самое.

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


person Adnan    schedule 02.04.2010    source источник
comment
Это реальный код из вашего приложения? В его нынешнем виде похоже, что вы перенаправляете обратно к тому же действию (индексу), что приведет к бесконечному циклу.   -  person mikej    schedule 02.04.2010


Ответы (3)


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

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

Но в вашем случае лучше использовать 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

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

person shingara    schedule 02.04.2010

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

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

@user = User.find(params[:id])  rescue ""
person FastSolutions    schedule 20.06.2014

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

person yfeldblum    schedule 02.04.2010
comment
Я уверен, что это неправильно. find с недопустимым идентификатором вызовет ActiveRecord::RecordNotFound. Если вы используете один из динамических искателей, например. User.find_by_name со значением, не соответствующим записи, будет возвращено nil. См. api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263 - person mikej; 02.04.2010
comment
Ну, сэр, я проверил, и вы правы. Спасибо. Вызов find в OP должен фактически подняться, если код на самом деле не User.find(:first, params[:id]). - person yfeldblum; 02.04.2010