в rails 3, как изящно перехватить неверный: id на URL для всех методов в моем контроллере? - PullRequest
1 голос
/ 26 января 2012

если кто-то напутает с: id в URL, например / edit / 15 и id 15 не существует, как я могу отобразить свою собственную страницу с ошибкой «страница не существует» вместо обработки представления (что приведет кошибка, так как она ожидает данные)

Я знаю, как добавить код для проверки этого метода по методу, но есть ли какой-нибудь глобальный способ отловить все такие ошибки в контроллере независимо от метода?

Я бы хотел избежать необходимости копировать / вставлять что-то вроде

redirect_to "/invalid_page.html" and return if @something.nil?

в каждый метод, где я делаю

@something = MyModel.find(params[:id])

Конечно, если это полностью поддельная ссылка, например, myapp.com/nosuchpage, затем отобразится страница /public/404.html.Но если это действительный маршрут, но недопустимый идентификатор, он выдает исключение в представлении, где представление неожиданно имеет дело с нулевыми данными, и я понятия не имею, существует ли место в контроллере для захвата и обработки этого исключения.

1 Ответ

3 голосов
/ 26 января 2012

взгляните на rescue_from в документации по рельсам. если вы используете find для загрузки ваших экземпляров ActiveRecord, он выдаст исключение ActiveRecord::RecordNotFound, если нет записи с данным идентификатором. вы можете сказать своему контроллеру, чтобы он спас это исключение и вместо этого вызвал метод / действие, например:

class UsersController < ....
  rescue_from ActiveRecord::RecordNotFound, :with => render_404


  def render_404
    render :status => 404, :text => 'not found'
  end
end

если вы находитесь на Mongoid, вам придется использовать Mongoid::Errors::DocumentNotFound. если вы используете собственный искатель, убедитесь, что он вызывает соответствующее исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...