在多个文件上组织 Sinatra 的“路由块”

pit*_*las 1 ruby sinatra

任何非平凡的 Sinatra 应用程序都将拥有比放入一个大 Sinatra::Base 后代类更多的“路线”。说我想把它们放在另一个班级,什么是惯用语?另一个阶级是什么派生的?我如何将它“包含”在主要的 Sinatra 类中?

max*_*ner 5

您可以在不同的文件中重新打开该类。

# 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)