在Rack映射中运行多个控制器

时间:2014-08-10 13:06:55

标签: ruby sinatra rack

在模块化的Sinatra应用程序中,我在config.ru文件中包含以下代码:

# ...
map '/' do
  run MyApp::Controller::WelcomesController
  run MyApp::Controller::Authenticated::Foo::HomesController
  run MyApp::Controller::Authenticated::Foo::SearchesController
end
# ...

控制器文件,例如 Homes controller

# app/controllers/authenticated/foo/homes_controller.rb
require_relative 'base'
module MyApp
  module Controller
    module Authenticated
      module Foo
        class HomesController < Foo::Base
          get '/Users/Foos' do
            haml 'authenticated/foo/homes/show'.to_sym
          end
        end
      end
    end
  end
end

搜索控制器

# app/controllers/authenticated/foo/searches_controller.rb
require_relative 'base'
module MyApp
  module Controller
    module Authenticated
      module Foo
        class SearchesController < Student::Base
          get '/Users/Foos/Searches' do
            haml 'authenticated/foo/searches/index'.to_sym
          end

          get '/Users/Foos/Searches/:id' do
            haml 'authenticated/foo/searches/show'.to_sym
          end
        end
      end
    end
  end
end

欢迎使用控制器

# app/controllers/welcomes_controller.rb
require_relative 'base'
module MyApp
  module Controller
    class WelcomesController < Base
      get '/' do
        haml 'welcomes/show'.to_sym, layout: false
      end
    end
  end
end

我不知道为什么,但似乎控制器的路线之间存在冲突。

例如,如果我评论HomesControllerSearchesController,那么WelcomesController的路线可用(200)。但是其他两个控制器的路径是不可访问的(404)。

如果我取消注释config.ru的3行,则只有3个控制器之一的路由可用。

有没有提示解决这个问题?非常感谢!

1 个答案:

答案 0 :(得分:5)

run只能获得一个map。添加更多map,或者您可以尝试Rack::Cascade

run Rack::Cascade.new([
  MyApp::Controller::WelcomesController, 
  MyApp::Controller::Authenticated::Foo::HomesController,
  MyApp::Controller::Authenticated::Foo::SearchesController,
])

顺便说一句,你没有赢得嵌套命名空间的奖品 - 它是Ruby,而不是Java;)