Sinatra具有相同名称的多个模型/助手

时间:2014-01-15 12:39:20

标签: model routes sinatra haml helper

我目前正在运行可以拥有不同版本(不同客户端)的Sinatra应用程序。您可以在两个版本之间切换,因为它们使用不同的会话变量来标识您应该登录的系统。

每个系统的文件结构非常相似,因此一些模型和帮助程序具有相同的名称,但它们的构建方式不同 - 它们以不同的方式执行相同的功能(即变量名称) ,行名称)。

当登录到系统时,您应该只有作为该系统一部分包含的帮助程序和模型的范围。文件结构如下:

- 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]

主桌面.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

然后在重新加载应用程序时修复问题 - 是否有办法阻止应用程序记住以前的模型/帮助程序?如果是这样,怎么办呢?

1 个答案:

答案 0 :(得分:0)

快速解决方案是使用load而不是require,因为每次请求时load都会重新加载文件。 但更好的解决方案是要求所有库和命名空间。谷歌将ruby中的模块作为命名空间