Sinatra模块化路由的一些方法比较

大家好,我是MARK24 。可以叫我 MARK。

目标:我想把 Sinatra 的不同模块分散在不同文件中,但是保持他们的工作正常。

问题讨论主要看到了 how-to-mount-a-sinatra-application-inside-another-sinatra-app

我发现不论是 include、extend 还是 对接 Sinatra 的 register 都不完美。

他们缺失实例的上下文。

当然,更加不推荐以 use 的方式以中间件的方式挂载路由。这样会让每个请求都经过无用的代码。

最佳的方法应该是模块化Sinatra的路由在不同文件中,但是依然运行在一个Sinatra上下文中。

我自己想到了一个方法, 这一点我得提前批判下自己,一直没有往这方面想有点思维懒惰了,就是总想找到现成的,可是我在用一个维框架啊。

微框架只有一个工作内核。看看网友讨论的就知道根本没有现成的。

好吧,其实很简单,创造一个DSL接口就好了

require "sinatra"

class App < Sinatra::Base

  class << self
    def define_routes(&block)
      class_eval(&block)
    end
  end

end

App.define_routes do 
  get "/hello"
    "hello world"
  end
end

这样就可以工作拉辣。

PS: 前几天因为模块化问题,我甚至研究了一下 Roda。

Roda 的思想非常好,不过理论上完美距离现实实际操作真的有很大的差距。Roda 的问题在于他的缩进过多的写法,马上在现实业务就会遭遇书写挫折和阅读困难。

不同程序在设计性和感受上真的不一样。

Roda 让我想到的就是 Lisp 为什么很难被广泛使用在生产中。

PPS:route API 在 Sinatra 中被使用了。这里使用 define_routes

最后回复了链接上的问题。

Mark24

Everything can Mix.