Беспородная проблема: один и тот же URL, разные ответы - PullRequest
0 голосов
/ 10 июля 2010

Я пишу небольшое приложение для изучения рубина и веб-разработки в целом. Приложение представляет собой небольшой блог, а веб-сервер - беспородный. Я установил простую структуру MVC поверх шавки, с фронтальным контроллером и диспетчером URL. Когда я впервые захожу на URL http://myapp/article/show/hello, отображается содержание статьи "привет".

Но с этого момента, когда я обновляю страницу или перехожу на другой URL, я вижу страницу ошибки 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 голосов
/ 10 июля 2010

Может быть, у меня есть подсказка. Это результат моего сеанса отладки на консоли:

Начать запрос / статью / индекс
uri [0]: uri [1]: статья uri [2]: индекс uri [3]:
controller_class: ArticleActions
контроллер_метод: индекс
Конечный запрос / статья / индекс

Начать запрос / статью / индекс
uri [0]: uri [1]: статья uri [2]: индекс uri [3]:
controller_class: ArticleActions
контроллер_метод: индекс
Конечный запрос / статья / индекс

Начать запрос /favicon.ico

uri [0]: uri [1]: favicon.ico uri [2]: uri [3]:
контроллер_класса: Favicon.icoActions
controller_method:
Сб 10 июля, 17:20:21 +0200 2010: Ошибка чтения #NameError: неверное имя константы Favicon.icoActions /home/ismaelsow/blog/utils/dispatcher.rb:22:in `const_defined? ' ...

Я думаю, что браузер инициирует запрос GET для favicon.ico и не может его найти, хотя у меня есть favicon.ico в корневом каталоге приложения. Я пробовал это с некоторыми изменениями:

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

Но, похоже, не работает.

...