我目前正在运行可以拥有不同版本(不同客户端)的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
然后在重新加载应用程序时修复问题 - 是否有办法阻止应用程序记住以前的模型/帮助程序?如果是这样,怎么办呢?
答案 0 :(得分:0)
快速解决方案是使用load而不是require,因为每次请求时load都会重新加载文件。 但更好的解决方案是要求所有库和命名空间。谷歌将ruby中的模块作为命名空间