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.ru
或 bundle 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+X
,Ctrl+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
没问题。
我正在研究一个 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 开发,其中所有这些配置都是内置的,我没有完全理解所有东西是如何连接在一起的。服务器在该端口上 运行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+X
,Ctrl+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
没问题。