Rails发送参数:{}而不是参数:{“action”=> “index”“controller”=> “指数”}

时间:2010-11-09 10:40:03

标签: ruby-on-rails routing

使我的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文件有关。

1 个答案:

答案 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)

语句。 因此,路由不会添加到请求对象中。