Подтвердить что ты не робот

Rails как перенаправить, если запись не найдена

Я пытаюсь перенаправить, если запись не найдена. Страница не перенаправляется, и я не вижу ошибку.

Мой контроллер:

def index
@link = Link.find(params[:id])
respond_to do |format|
    if @link.blank?
    format.html { redirect_to(root_url, :notice => 'Record not found') }
    else
    format.html { render :action => "index" }
    end
end
end
4b9b3361

Ответ 1

То, что я делал, это положить это в конце метода:

rescue ActiveRecord::RecordNotFound
  redirect_to root_url, :flash => { :error => "Record not found." }

Еще лучше, поставьте его как round_filter для своего контроллера:

around_filter :catch_not_found

private

def catch_not_found
  yield
rescue ActiveRecord::RecordNotFound
  redirect_to root_url, :flash => { :error => "Record not found." }
end

Ответ 2

Ошибка

генерируется Link.find - возникает исключение, если объект не найден

вы можете немного упростить свой код:

def index
  @link = Link.find_by_id(params[:id])

  redirect_to(root_url, :notice => 'Record not found') unless @link

  respond_to do |format|
    format.html
  end
end

Ответ 3

Вы на правильном пути, просто запишите исключение RecordNotFound:

def index
  @link = Link.find(params[:id])
  # should render index.html.erb by default
rescue ActiveRecord::RecordNotFound
  redirect_to(root_url, :notice => 'Record not found')
end

Ответ 4

Очень сложный... Я нашел простое решение для этого... Это решение работает для меня

@link = Link.where(: id = > params [: id]). first

Я использую .first, потому что .where вернет массив. Конечно, этот массив имеет только один элемент. Итак, когда нет такой записи с таким id, она вернет пустой массив, назначит пустой элемент @link... Теперь проверьте, что @link либо пустая, либо нет.

Заключение: нет необходимости предоставлять обработку исключений для простой проверки Это проблема с .find, она выдает исключение, если нет записи. Используйте .where, он вернет пустой массив

И извините за мой плохой английский

Ответ 5

Я бы предпочел использовать find_by. find_by найдет первую запись, соответствующую заданным условиям. Если запись не найдена, она вернет нуль, но не вызывает исключение, так что вы можете перенаправить на другую страницу.


def index
  @link = Link.find_by(id: params[:id])

  redirect_to(root_url, :notice => 'Record not found') unless @link
end