gpt4 book ai didi

ruby - Sinatra 路由评估,与动态路由相关

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:46 25 4
gpt4 key购买 nike

希望这是一个简单的答案,我是 Ruby 和 Sinatra 的新手。

我正在考虑使用模块化方法编写一个 sinatra 应用程序,但是我希望能够以插件方式添加新路由。

目前我有一个继承自 Sinatra::Base 的 SinatraApp 类,现在我有一个名为 load_plugins 的方法,它通过插件文件夹并包含所有 routing-definition.rb 文件,这些文件是包含更多路由的模块。

因此,根据问题的背景,我想知道 Sinatra 如何管理其路由。是第一次初始化加载 SinatraApp 然后将其保存在机架进程(或任何运行它的进程)的内存中的情况,还是 SinatraApp 重新评估每个请求?

以这种情况为例,UserA 加载一个返回 html 页面的路由,UserA 单击一个链接并返回 404,因为插件不存在,AdminA 然后将一个新插件添加到插件文件夹中,UserA 然后刷新他们的插件页面,他们得到一个 html 页面而不是 404,因为插件已经添加了路由。

是否会发生上述情况,或者我是否需要重新启动 Sinatra 服务器以使其获取新的插件文件?

我的一部分希望它会在每次请求时更新加载的插件...但是我的一部分知道如果每个请求都需要扫描目录以查找插件,那将影响性能。

== 编辑 ==

在下面添加了我的意思的示例。我不确定它是否应该像模块一样结构化或像下面这样内联,如果包含字面上的代码转储到当前范围内,那么 get ""会知道它应该在 SinatraMain 应用程序的范围内调用 get,无论哪种方式让你知道我在追求什么。

require 'sinatra'

class SinatraMain < Sinatra::Base

def load_plugins
Dir["/plugins/**/routing-plugin.rb"].each do |plugin_file|
include plugin_file
end
end

get "/test" do
return "This is a test route"
end

get "/plugins/*" do
load_plugins
return "Plugins refreshed"
end
end

SinatraMain.run!

# Imagine this was within /plugins/SayHelloPlugin/routing-plugin.rb
get "/say-hello"
return "Saying hello"
end

所以这个想法是,每当这些 plugin 文件被添加到插件文件夹时,它应该将路由添加到应用程序,当它们被删除时,将它们从路由中移除(尽管后者点现在不那么重要)。

最佳答案

根据我对源代码的阅读 (https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb) Sinatra 将路由存储为 Sinatra::Base 类上的类变量,因此路由不会对每个请求重新评估,尽管 Sinatra/Rack 会为每个请求创建一个新的应用程序实例。

您当然可以在运行时添加额外的路由,而无需重新加载所有路由。我不知道你是如何加载你的插件的,但它应该可以在不重新启动 Sinatra 的情况下做你想做的事情,这是一个添加新路线的粗略演示/实验:

require 'rubygems'
require 'sinatra/base'

class App < Sinatra::Base
get '/' do
"hello [self.object_id: #{self.object_id}, App.routes.object_id: #{App.routes.object_id}]"
end

get '/add_route' do
App.get '/new_route' do
"from new route [self.object_id: #{self.object_id}, App.routes.object_id: #{App.routes.object_id}]"
end
"new route added [self.object_id: #{self.object_id}, App.routes.object_id: #{App.routes.object_id}]"
end

run! if /app.rb$/ =~ $0
end

如果您运行此程序,您将看到应用程序在每次请求时都获得一个新的 object_id,但 App.routes 哈希始终是同一个对象。

关于ruby - Sinatra 路由评估,与动态路由相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7927027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com