Sinatra 路由 - 单独的文件

Sinatra Routing - Separate Files

我正在研究一个 recently released book on Sinatra,它演示了这种在不同文件中设置路由的方法:

# app.rb
require "sinatra"
require "slim"

class Todo < Sinatra::Base
  # ...
  Dir[File.join(File.dirname(__FILE__), "lib", "*.rb")].each { |lib| require lib }
end

# lib/routes.rb
get "/test" do
  "The application is running"
end

# config.ru
require "sinatra"
require "bundler/setup"
Bundler.require

ENV["RACK_ENV"] = "development"

require File.join(File.dirname(__FILE__), "app.rb")

Todo.start!

但是,它无法找到 http://localhost:4567/test 处的路线。当我 运行 ruby config.rubundle exec rackup -p 4567 时这应该起作用对我来说是有意义的。但是来自 Rails 开发,其中所有这些配置都是内置的,我没有完全理解所有东西是如何连接在一起的。服务器在该端口上 运行ning,我得到 Sinatra doesn't know this ditty 404 页面。如果我重新打开 class as suggested by this SO answer,就会找到 /test 路由。

# lib/routes.rb 
class Todo < Sinatra::Base
  get "/test" do
    "The application is running"
  end
end

在不重新打开 class 的情况下包含路由的建议方法有什么我遗漏的吗?

试试 ruby app.rb,应该可以。

本书建议从 config.ru 文件 Todo.start! 到 运行 应用程序,但 Sinatra documentation 示例使用 run Sinatra::Application。所以我只是将行从 Todo.start! 更改为

run Todo

这似乎可行,但我必须调查一下后果。

您需要重新启动网络服务器以加载在 运行 时添加的路由。当调用 app.rb 并启动 Sinatra 时,路由被加载到内存中。路由本身看起来不错,而且似乎 routes.rb 正在通过 Dir[File.join(File.dirname(__FILE__), "lib", "*.rb")].each { |lib| require lib }.

成功导入

如果你是 运行 服务器直接通过终端 Ctrl+XCtrl+C 应该关闭它,然后通过 rackup config.ru* 或 [=15= 重新启动它].您可以通过浏览器向 http://127.0.0.1:4567/test.

发出获取请求来确认路由已被识别

要使 rackup config.ru 命令生效,您可以将 config.ru 更改为:

# config.ru
require './app'
run Sinatra::Application

这只是为了方便部署。

编辑:@shaun,因为 Todo 扩展了 Sinatra::Base 在你的情况下使用 run Todo 没问题。