加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读