Ошибка при инициализации в Ruby on Rails - PullRequest
0 голосов
/ 01 октября 2009

Что я хочу сделать: перенаправить пользователя на специальную страницу с ошибкой, если база данных не работает.

Я использую базу данных Oracle с адаптером OCI.

Похоже, что, если база данных недоступна (скажем, не работает для резервного копирования), адаптер OCI выдает ошибку, прежде чем я когда-либо попаду в контроллер (на основе трассировки стека это происходит при настройке пула соединений). Поэтому я не могу использовать rescue_from или rescue_action даже в ApplicationController - линия спасения никогда не достигается.

Есть ли способ «обернуть» инициализацию или иным образом спасти конкретную ошибку на более высоком уровне (или более ранней точке), чем ApplicationController?

1 Ответ

1 голос
/ 01 октября 2009

Попробуйте переопределить ActionController :: Failsafe или прикрепить другое промежуточное ПО перед его установкой в ​​стек, вы сможете отлавливать почти все исключения оттуда и 302. По желанию.

Пример:

class DbFailsafe
  def new(app)
    @app = app
  end

  def call(env)
    @app.call(env)
  rescue DataBaseError => e
    [302, {"Content-Type" => "text/plain", "Location" => "http://otherserver.com/sorrt-the-site-is-down.html"}, ["You are being redirected to http://otherserver.com/sorrt-the-site-is-down.html"]]
  end
end

и в вашей среде. Rb

config.middleware.insert_after ::ActionController::Failsafe, DbFailsafe

Я бы порекомендовал (потому что мы должны получить 5xx, а не 3xx) для рендеринга простой страницы с перенаправлением js. Это просто сделать, просто отредактируйте public/500.html.

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