大家好,我是 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
最后回复了链接上的问题。