2015-06-18 21 views
2

我有一个经典的西纳特拉应用:红宝石/西纳特拉 - 使用助手*类,还可以消耗西纳特拉设置

module Tds 
    class Application < Sinatra:: Application 
    set :persons, [] 
    end 
end 

我所有的航线被分解成在风格上面的控制器。

我正在使用sinatra-websockets构建一个websockets应用程序,所以我想使用一些自行开发的对象来帮助我管理连接状态。我可能要一个辅助类是这样的:

class Person 
    attr_accessor: :favorite_color, :name, :etc 
end 

我想保存我的人在西纳特拉设置阵列:

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对象。

我很确定我只是不习惯西纳特拉会议。任何指导给我?

+0

我有点困惑,如何存储使用设置的人员可以工作。也许我有点愚蠢。每个用户如何从中获得相同的价值,除非它存储在Sinatra以外的某个地方? –

+1

建议不要让您的Person类取决于Sinatra。这会让测试变得更加困难,不是吗? IMO依赖注入是你的朋友 - 当然这会让你的问题消失... –

回答

0

我不知道使用像这样的设置数组之前。这个settings数组是否作为Sinatra的一部分存在?你能像这样存储东西吗?

我想如果有可能那么公平,但可能有一些限制。获得持久性的一般做法是使用session散列。这仅限于几千字节,因此如果它不够大,请设置一个数据库。

1

看到这样的地方,你保留这些碎片有点令人困惑。 我们需要查看整个代码来准确找出问题所在。 你知道在你的主文件/类中需要一个helpers.rb文件吗? 还包括,因为它是一个模块? 将模块放置在模块内部或外部会影响范围。

如果你能发布整个的代码,我们可以提供更多的帮助,如果没有,这里一些一般的提醒..

的设置在西纳特拉对象是你在你的主类/启动文件配置的内容。 做

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' 
... 

在您的帮助文件中,您可以在同一应用西纳特拉命名空间访问这些设置这样

settings.files