Жемчужина драгоценного камня: хотите выхватить исключение

Я использую этот apartment рубиновый камень.

Я добавил это в файл application.rb:

config.middleware.use 'Apartment::Elevators::Subdomain'

Когда я пытаюсь ударить это в браузере url 'test.domain.local: 3000', где в тестовом режиме sub domain не существует в PostgreSQL, я вижу эту ошибку

Apartment::SchemaNotFound (One of the following schema(s) is invalid: test, "public")

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

Ответ 1

Это то, что я сделал:

Создать файл под lib/rescued_apartment_middleware.rb

module RescuedApartmentMiddleware
  def call(*args)
    begin
      super
    rescue Apartment::TenantNotFound
      Rails.logger.error "ERROR: Apartment Tenant not found: #{Apartment::Tenant.current.inspect}"
      return [404, {"Content-Type" => "text/html"}, ["#{File.read(Rails.root.to_s + '/public/404.html')}"] ]
    end
  end
end

и добавьте в файл инициализатора квартиры следующие строки:

require 'rescued_apartment_middleware'

Rails.application.config.middleware.use 'Apartment::Elevators::Subdomain'
Apartment::Elevators::Subdomain.prepend RescuedApartmentMiddleware

Это работает как шарм! (Протестировано с рубином 2.1 и Rails 4.1)