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
Ответы
Ответ 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