Kru*_*rut 5 ruby hanami hanami-router
有没有办法将地图和(莲花)路由器命名空间一起使用?下面是config.ru我试图作为演示运行的示例.
require 'bundler'
Bundler.require
module Demo
class Application
def initialize
@app = Rack::Builder.new do
map '/this_works' do
run Proc.new {|env| [200, {"Content-Type" => "text/html"}, ["this_works"]]}
end
map '/api' do
run Lotus::Router.new do
get '/api/', to: ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
get '/*', to: ->(env) { [200, {}, ["This is catch all: #{ env['router.params'].inspect }!"]] }
end
end
end
end
def call(env)
@app.call(env)
end
end
end
run Demo::Application.new
Run Code Online (Sandbox Code Playgroud)
您的问题是由于do..end方法调用的优先级.在你的代码中的部分
run Lotus::Router.new do
get '/api/', to: ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
get '/*', to: ->(env) { [200, {}, ["This is catch all: #{ env['router.params'].inspect }!"]] }
end
Run Code Online (Sandbox Code Playgroud)
被Ruby解析为
run(Lotus::Router.new) do
get '/api/', to: ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
get '/*', to: ->(env) { [200, {}, ["This is catch all: #{ env['router.params'].inspect }!"]] }
end
Run Code Online (Sandbox Code Playgroud)
换句话说,块传递给run,而不是Lotus::Router.new按照您的意图传递,并run简单地忽略块.
要修复它,您需要确保该块与路由器的构造函数相关联,而不是调用run.有几种方法可以做到这一点.您可以使用{...}而不是do...end,因为它具有更高的优先级:
run Lotus::Router.new {
#...
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是将路由器分配给局部变量,并将其用作以下参数run:
router = Lotus::Router.new do
#...
end
run router
Run Code Online (Sandbox Code Playgroud)