2010-05-26 4 views
1

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

Обычно Mysql::Error выбрасывается из соединения адаптера тузд в 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 

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

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

Любой вход был бы оценен.

ответ

1

Вы могли бы создать представление в любой контроллер 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 %></code></pre> 

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

0

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

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

Stephan

+0

Стефан, спасибо за ваш ответ. В этом случае я использую Nginx> Mongrel Cluster. – RobB

Смежные вопросы