我正在通过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.ru
或bundle 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
在没有重新开课的情况下,是否存在我想要的包含路线的方法?
答案 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
。