在机架图中运行多个控制器

Sis*_*sss 1 ruby rack sinatra

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

# ...
map '/' do
  run MyApp::Controller::WelcomesController
  run MyApp::Controller::Authenticated::Foo::HomesController
  run MyApp::Controller::Authenticated::Foo::SearchesController
end
# ...
Run Code Online (Sandbox Code Playgroud)

以及控制器文件,例如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
Run Code Online (Sandbox Code Playgroud)

搜索控制器

# 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
Run Code Online (Sandbox Code Playgroud)

欢迎控制器

# 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

有解决此问题的技巧吗?非常感谢!

iai*_*ain 5

run每人只得到一个map。添加更多maps,或者您可以尝试Rack :: Cascade

run Rack::Cascade.new([
  MyApp::Controller::WelcomesController, 
  MyApp::Controller::Authenticated::Foo::HomesController,
  MyApp::Controller::Authenticated::Foo::SearchesController,
])
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您不会因为嵌套名称空间而获奖-它是Ruby,而不是Java;)