杂种问题:相同的网址,不同的响应

时间:2010-07-10 09:06:26

标签: ruby mongrel

我正在编写一个小应用程序,以便一般学习ruby和Web开发。该应用程序是一个小博客,Web服务器是杂项。我在mongrel之上建立了一个简单的MVC结构,带有一个前端控制器和一个url调度程序。当我第一次访问网址http://myapp/article/show/hello时,会显示“你好”文章的内容。

但从那时起,当我刷新页面或转到另一个网址时,这是我设置的404错误页面。我找到解决问题的唯一方法是为每个请求重新启动服务器,显然,这不是解决方案!

我的代码如下所示:

launch.rb

require 'rubygems'
require 'mongrel'
require 'config/settings'
require File.join(Settings::UTILS_DIR, "dispatcher.rb") 

class FrontController < Mongrel::HttpHandler
  def process(request, response)

    route = Dispatcher.new.dispatch(request.params["REQUEST_URI"]) 
    controller = route["class"] 
    action = route["method"]
    params = route["params"]
    action_output = controller.new.send(action, params)

    response.start(200) do |head, out|
      head["Content-Type"] = "text/html" 
      out << action_output 
    end 
  end 
end

h = Mongrel::HttpServer.new("192.168.0.103", "3000") 
h.register("/", FrontController.new)
h.run.join

dispatcher.rb

require File.join(Settings::CONFIG_DIR, "controllers.rb")

class Dispatcher
  def dispatch(uri)

    uri = uri.split("/")
    if uri.size == 0
      return {"class" => Controllers.const_get(:ArticleActions), "method" => :index, "params" => nil}
    end 

    route = {}
    unless uri[1].nil? and uri[2].nil?
      controller_class = uri[1].capitalize << "Actions" # All controllers classes follow this form : ControllerActions
      controller_method = uri[2]
      route["class"] = Controllers.const_defined?(controller_class) ? Controllers.const_get(controller_class) : nil 
      route["method"] = ( route["class"] and route["class"].method_defined?(controller_method) ) ? controller_method : nil 
      route["params"] = uri.slice(3, uri.size) ? uri.slice(3, uri.size) : nil 
    end 

    # If url not valid
    if route["class"].nil? or route["method"].nil?
      route["class"] = Controllers.const_get(:ErrorActions)
      route["method"] = :error404
      route["params"] =  nil 
    end 

    route
  end 
end

要启动应用程序和服务器,我只需要执行ruby launch.rb。 从昨晚开始,我的脑袋受伤了。任何的想法 ? 感谢。

1 个答案:

答案 0 :(得分:0)

也许我有一个暗示。 这是我在控制台上调试会话的结果:

开始请求/文章/索引
uri [0]:uri [1]:article uri [2]:index uri [3]:
controller_class:ArticleActions
controller_method:index
结束请求/文章/索引

开始请求/文章/索引
uri [0]:uri [1]:article uri [2]:index uri [3]:
controller_class:ArticleActions
controller_method:index
结束请求/文章/索引

开始请求/favicon.ico

uri [0]:uri [1]:favicon.ico uri [2]:uri [3]:
controller_class:Favicon.icoActions
controller_method:
星期六7月10日17:20:21 +0200 2010:读取错误#NameError:错误的常量名称Favicon.icoActions /home/ismaelsow/blog/utils/dispatcher.rb:22:在`const_defined?' ...

我认为浏览器发起了对favicon.ico的GET请求而未能找到它,很难在应用程序的根目录中有一个favicon.ico。 我尝试了一些变化:

h.register("/favicon.ico", Mongrel::DirHandler.new(File.dirname(__FILE__)))
h.register("/", FrontController.new)

但它似乎不起作用。