在模块化的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
我不知道为什么,但似乎控制器的路线之间存在冲突。
例如,如果我评论HomesController
和SearchesController
,那么WelcomesController
的路线可用(200)。但是其他两个控制器的路径是不可访问的(404)。
如果我取消注释config.ru
的3行,则只有3个控制器之一的路由可用。
有没有提示解决这个问题?非常感谢!
答案 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;)