Sinatra路由 - 单独的文件

时间:2016-06-24 15:19:09

标签: ruby sinatra

我正在通过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开发,其中所有这些配置都是内置的,我没有完全理解一切如何连接在一起。服务器正在该端口上运行,我得到Sinatra doesn't know this ditty 404页面。如果我重新打开课程as suggested by this SO answer,则会找到/test路线。

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

在没有重新开课的情况下,是否存在我想要的包含路线的方法?

3 个答案:

答案 0 :(得分:2)

试试ruby app.rb,它应该有用。

答案 1 :(得分:1)

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

run Todo

这似乎有效,但我必须研究后果。

答案 2 :(得分:1)

您需要重新启动网络服务器以加载在运行时添加的路由。调用app.rb并启动Sinatra时,路由将加载到内存中。路线本身看起来很好,看来通过Dir[File.join(File.dirname(__FILE__), "lib", "*.rb")].each { |lib| require lib }成功导入routes.rb。

如果您是通过终端Ctrl+X直接运行服务器,Ctrl+C应将其关闭,然后通过rackup config.ru *或ruby app.rb重新启动它。您可以通过浏览器向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