我有一个经典的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不会这样做。 t支持类作为帮助者?或者根本不使用帮助者?)
在命名空间问题之后,我仍然有范围问题。无论我尝试过什么,即使我可以找出命名空间问题(而且我也不记得我是怎么做的),我的帮助程序类无法访问Settings对象。
我相当确定我不习惯Sinatra会议。对我有什么指导?
答案 0 :(得分:1)
这样看起来有点令人困惑,你保留这些片段。 我们需要查看整个代码以确切地指出错误。 您知道主文件/类中需要一个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
答案 1 :(得分:0)
我之前不知道正在使用的设置数组。这个settings
数组是否作为Sinatra的一部分存在?你可以像这样存放东西吗?
我想如果有可能那么公平,但可能会有一些限制。获得持久性的一般做法是使用session
哈希。这仅限于几千字节,因此如果它不够大,请设置数据库。