2015-06-18 17 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