我有一个经典的Sinatra应用程序:
module Tds
class Application < Sinatra:: Application
set :persons, []
end
end
我的所有路由都按照上述样式分解为控制器。
我正在使用sinatra-websockets构建一个websockets应用程序,所以我想使用一些自制的对象来帮助我管理我的连接状态。我可能需要这样的帮助程序类:
class Person
attr_accessor: :favorite_color, :name, :etc
end
我想将我的人存储在 Sinatra 设置数组中:
get '/' do
person = Person.new(init_data)
settings.persons << person
erb :whatev
end
但我希望 Person 类能够访问 sinatra 设置对象,以便它可以进行一些自我维护。也许是这样的:
get '/quit' do
person.delete!
end
这将这样做:
class Person
#....
def delete!
settings.persons.delete_if{|p| p == self}
end
end
我很确定我的伪代码非常接近实际代码,给出或接受语法问题或记错关键字。
我一直遇到的问题是名称空间问题 - 要么我不明白将我的辅助类放在哪里(我是否必须将它们放在模块 Tds 中并将它们包含在某个地方?)或者 Sinatra 不支持类作为辅助程序?还是我根本不使用助手?
在命名空间问题之后,我仍然有范围问题。无论我尝试了什么,即使我可以弄清楚命名空间问题(我不记得我是怎么做到的),我的帮助程序类也无法访问 Settings 对象。
我很确定我只是不习惯辛纳屈公约。对我有什么指导吗?
看到这样保存这些片段的地方有点令人困惑。我们需要查看整个代码,以准确指出问题所在。您知道您的主文件/类中需要 helpers.rb 文件吗?并且还包括,因为它是一个模块?将类放在模块内部或外部会在范围上有所不同。
如果您可以发布整个代码,我们可以提供更多帮助,如果没有,请在此处提供一些一般建议。
Sinatra中的设置对象是您在主类/启动文件中配置的对象。通过做
configure do
enable :run
set :port, 8003
...
set :public_folder, File.join(File.dirname(__FILE__), 'public')
set :files, File.join(settings.public_folder, 'files')
end
或者只是
set :port, 8002
set :bind, '0.0.0.0'
...
在帮助程序中,您可以访问同一 Sinatra 应用程序命名空间中的这些设置,如下所示
settings.files
以前像这样使用的设置数组。这个settings
数组是否作为Sinatra的一部分存在?你能像这样存储东西吗?
我想如果可能的话,那就足够公平了,但它可能会有一些限制。获取持久性的一般做法是使用 session
哈希。这仅限于几千字节,因此如果它不够大,请设置一个数据库。