ruby – 如何使用带有Rack :: Builder :: map的lotus路由器
发布时间:2020-12-17 03:32:07 所属栏目:百科 来源:网络整理
导读:有没有办法将地图和(莲花)路由器命名空间一起使用?下面是一个示例config.ru我试图作为演示运行. require 'bundler'Bundler.requiremodule Demo class Application def initialize @app = Rack::Builder.new do map '/this_works' do run Proc.new {|env| [2
有没有办法将地图和(莲花)路由器命名空间一起使用?下面是一个示例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 '/*',["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 解决方法
您的问题是由于方法调用中do..end的优先级.在你的代码中的部分
run Lotus::Router.new do get '/api/',['Welcome to Lotus::Router!']] } get '/*',["This is catch all: #{ env['router.params'].inspect }!"]] } end 被Ruby解析为 run(Lotus::Router.new) do get '/api/',["This is catch all: #{ env['router.params'].inspect }!"]] } end 换句话说,块被传递给运行,而不是按照您的意图传递给Lotus :: Router.new,并且只是忽略块. 要修复它,您需要确保该块与路由器的构造函数相关联,而不是运行调用.有几种方法可以做到这一点.您可以使用{…}而不是…结束,因为它具有更高的优先级: run Lotus::Router.new { #... } 另一种方法是将路由器分配给局部变量,并将其用作运行的参数: router = Lotus::Router.new do #... end run router (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |