Rails: Показать страницу обслуживания, если нет соединения с базой данных - PullRequest
1 голос
/ 26 мая 2010

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

Обычно Mysql::Error выбрасывается из адаптер подключения mysql в active_record Что-то вроде:

/!\ FAILSAFE /!\  Wed May 26 11:40:14 -0700 2010
  Status: 500 Internal Server Error
  Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock

Есть ли способ с минимальными издержками, чтобы перехватить эту ошибку и вместо этого отобразить страницу обслуживания?

I'mПредполагая, что поскольку соединения на самом деле выполняются в адаптере active_record mysql, приложение никогда не попадает в стек контроллера до того, как выдает ошибку, поэтому вы не можете перехватить его в контроллере.

Любой ввод будетс благодарностью.

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Вы можете создать представление в любом контроллере root_path:

map.root :controller => "foo", :action => "index"

Допустим, вы называете это представление "db_maintenance.html.erb". В вашем контроллере сделайте это:

def index
  begin
    @widgets = Widget.find(:all)
  rescue Exception => e
    # This will only happen if DB stuff fails
    redirect_to :action => "db_maintenance", :error => e.message
  end
end

...

def db_maintenance
  @error = params[:error] # You might want to do something with this here or in the view
  # renders the app/views/foo/db_maintenance.html.erb view
end

На ваш взгляд, вы можете поместить что-то вроде:

<h1>Sorry for the inconvenience</h1>
blah blah blah. This happened because of:
<pre><code><%= @error %>

Это, конечно, помогает, только если пользователь заходит на главную страницу вашего сайта, но вы можете легко экстраполировать его. Вы можете добавить действие «def db_maintenance» в контроллер приложения и вручную указать, какое представление оно также должно отображать. Это не идеально, но это должно сделать работу.

0 голосов
/ 27 мая 2010

Я думаю, что это касается вашей конфигурации интерфейса. Например, если у вас есть Apache перед некоторыми шавками, вы можете настроить Apache с помощью инструкций ErrorDocument для отображения подходящего файла в случае ошибки.

Какой у вас интерфейс?

Stephan

...