【问题标题】:Sinatra Multiple Models / Helpers with same nameSinatra 多个具有相同名称的模型/助手
【发布时间】:2014-02-03 22:29:56
【问题描述】:

我目前正在运行一个可以有不同版本(不同客户端)的 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

然后在重新加载应用程序时解决此问题 - 有没有办法防止应用程序记住以前的模型/帮助程序?如果是这样,该怎么做?

【问题讨论】:

    标签: model routes sinatra haml helper


    【解决方案1】:

    快速解决方案是使用 load 而不是 require,因为 load 会在您每次询问时重新加载文件。 但更好的解决方案是要求所有库并创建名称空间。 Google for ruby​​ 中的模块作为命名空间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多