2014-01-15 65 views
0

我目前正在運行一個可以有不同版本(不同客戶端)的Sinatra應用程序。您可以在兩個版本之間切換,因爲它們使用不同的會話變量來確定您應該登錄哪個系統。Sinatra Multiple Models/Helpers同名

每個系統的文件結構非常相似,所以一些模型和幫助程序具有相同的名稱,但它們的構建方式不同 - 它們執行的功能相同但方式不同(即變量名字,行名)。

它應該在登錄到系統時工作,您應該只有作爲該系統一部分的助手和模型的範圍。文件結構是像這樣:

- application.rb 
- routes 
- models 
- views 
- clients 
    - system1 
     - desktop.rb 
     - routes 
     - models 
     - views 
    - system2 
     - desktop.rb 
     - routes 
     - models 
    - helpers 
     - views 

的desktop.rb文件包含有關路線只有該系統,並且每個系統的desktop.rb文件只裝載作爲會話的一部分 - 會話更改時改變系統。

在系統之間切換時發生的問題,sinatra會記住舊模型和幫助程序的位置,因爲它們具有相同的類名 - 即使作爲主要application.rb文件的一部分,我們只加載desktop.rb文件這是相關的。

作爲登錄過程的一部分,$ path變量被設置,並且在切換系統時$ path被重新設置爲新路徑。

$path = session[:systempath] 

主要desktop.rb文件

if session[:systemid] 
    # Get client/system specific path 
    require "./#{$path}/desktop.rb" if $path 
end 

的助手和模型,然後從所需的desktop.rb文件的一部分,然後叫從路由的路由所需要的。

require_relative "../../models/agent/agent.model.rb" 
require_relative "../../helpers/agent/agent.helper.rb" 

db = DBAgent.new 

當重新加載應用程序時,問題是固定的 - 是否有辦法阻止應用程序記住以前的模型/幫助程序?如果是這樣怎麼辦?

回答

0

快速解決方案是使用加載而不是require,因爲每次請求時加載都會重新加載文件。 但更好的解決方案是要求所有庫和命名空間。谷歌模塊在紅寶石作爲命名空間