任何非平凡的 Sinatra 应用程序都将拥有比放入一个大 Sinatra::Base 后代类更多的“路线”。说我想把它们放在另一个班级,什么是惯用语?另一个阶级是什么派生的?我如何将它“包含”在主要的 Sinatra 类中?
您可以在不同的文件中重新打开该类。
# file_a.rb
require 'sinatra'
require_relative "./file_b.rb"
class App < Sinatra::Base
get("/a") { "route a" }
run!
end
# file_b.rb
class App < Sinatra::Base
get("/b") { "route b" }
end
Run Code Online (Sandbox Code Playgroud)
如果你真的想要不同的类,你可以做这样的事情,但它有点难看:
# file_a.rb
require 'sinatra'
require_relative "./file_b.rb"
class App < Sinatra::Base
get("/a") { "route a" }
extend B
run!
end
# file_b.rb
module B
def self.extended(base)
base.class_exec do
get("/b") { "route b" }
end
end
end
Run Code Online (Sandbox Code Playgroud)
我很确定这两个是最简单的方法。当您查看 Sinatra 如何从类似方法中实际添加路由的源代码时get,会发现它非常麻烦。
我想你也可以做一些像这样愚蠢的事情,但我不会完全称之为惯用语:
# file_a.rb
require 'sinatra'
class App < Sinatra::Base
get("/a") { "route a" }
eval File.read("./file_b.rb")
run!
end
# file_b.rb
get("/b") { "route b" }
Run Code Online (Sandbox Code Playgroud)