2014-01-15 2 views
0

В настоящее время я использую приложение Sinatra, которое может иметь разные версии (разные клиенты). Вы можете переключаться между двумя версиями, так как они используют разные переменные сеанса, чтобы определить, в какую систему вы должны войти.Sinatra Несколько моделей/Помощники с таким же именем

Файловая структура для каждой из систем весьма схожа, поэтому некоторые модели и помощники имеют одно и то же имя, но отличаются тем, как они построены - они выполняют ту же функцию, но по-разному (т.е. переменную имена, имена строк).

Должно работать, что при входе в систему у вас должен быть только объем помощников и моделей, которые включены как часть этой системы. Структура файла следующим образом:

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

The desktop.rb файлы содержат соответствующие маршруты только для этой системы, и файл desktop.rb для каждой системы загружаются только в рамках сессии - изменения сессии, когда изменение системы.

Проблема, возникающая при переключении между системами, синатра помнит места расположения старых моделей и помощников, поскольку они имеют одинаковые имена классов - хотя в качестве части основного файла 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

Быстрое решение - использовать нагрузку вместо требуемого, потому что загрузка перезагружает файл каждый раз, когда вы его запрашиваете. Но гораздо лучшее решение - потребовать все библиотеки и создать пространства имен. Google для модуля в рубине как пространство имен

Смежные вопросы