使我的rails网站工作,即使数据库处于关闭状态。在def rescue_action_in_public(exception)
函数我捕获Mysql:Error异常并呈现一个页面,其中有任何数据库引用,如
def rescue_action_in_public(exception)
when Mysql::Error, Errno::ECONNREFUSED, Timeout::Error
puts "-----the controller name #{controller_name}"
if controller_name == "index"
render :template => 'index/index'
end
这非常有效,当我启动应用程序时,立即停止数据库并尝试访问我的页面。
但如果我启动应用程序,请浏览几页然后停止数据库。现在尝试访问页面,我可以在日志中看到空参数,如
Parameters: {}
而不是
Parameters: {"action" => "index" "controller" => "index"}
因此这个条件
if controller_name == "index"
未得到满足。
我不知道,为什么在这个Senario中没有设置正确的控制器名称。 或者如果它与routes.rb文件有关。
答案 0 :(得分:1)
我不得不添加这一行
@controller = Routing::Routes.recognize(@request)
到
def failsafe_rescue(exception)
在action_controller / dispatcher.rb文件中
def failsafe_rescue(exception)
@controller = Routing::Routes.recognize(@request) //added line
self.class.failsafe_response(@output, '500 Internal Server Error', exception) do
if @controller ||= defined?(::ApplicationController) ? ::ApplicationController : Base
@controller.process_with_exception(@request, @response, exception).out(@output)
else
raise exception
end
end
end
所以原因是这样的。当MYSQL:ERROR异常发生时,在
中 def dispatch
方法,控件转到failsafe_rescue而不是方法
def handle_request
有
@controller = Routing::Routes.recognize(@request)
语句。 因此,路由不会添加到请求对象中。