Я создаю приложение, состоящее из ядра и нескольких модулей. Модули представляют собой рельсовые механизмы и обеспечивают реальную функциональность, поскольку само ядро действует только как хост.
Движки размещаются из /lib
и монтируются по соответствующим путям.
coreApp
└──lib
├── module1
├── module2
└── etc
Затем модули монтируются следующим образом.
mount Module1::Engine => "/module1", :as => "module1"
mount Module2::Engine => "/module2", :as => "module2"
Ядро также отвечает за обработку сеанса, хотя сам вход в систему выполняется модулем.
Мне еще предстоит найти отличный способ поделиться макетом основного приложения с движками. На данный момент вот как я делаю макет доступным для движков:
coreApp
└── app
└── views
└── layouts
├── application.html.erb
└── core.html.erb
Файл core.html.erb
содержит только
<%= render :template => 'layouts/application' %>
Is затем включается в каждый модуль, как этот
module Module1
class ApplicationController < ActionController::Base
layout "core"
end
end
Хотя он не особенно элегантен, он отлично работает, и содержимое модуля отображается там, где оператор yield
в макете приложения.
Проблемы заключаются в следующем:
Мне нужен способ включения таблиц стилей активного модуля.
Заголовок содержит информацию о вошедшем в систему пользователе, например
Logged in as <%= @user[:realname] %>
Это исходит от ядер home_controller
def index
@user = User.find_by_id(session[:user])
end
Но когда я пытаюсь получить доступ к модулю, я получите следующую ошибку
NoMethodError in Module1/home#index
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]
Очевидно, ссылаясь на @user
.
Как можно решить эту проблему максимально элегантно и СУХО без особых изменений со стороны двигателя?
Я много гуглил, но не могу понять, как решить эту проблему. Это может быть полное отсутствие понимания того, как работает рельсы, поэтому есть большая вероятность, что этот вопрос не имеет смысла даже для того, кто хорошо знает рельсы.
Прокомментируйте, если что-то неясно или двусмысленно, и я постараюсь уточнить.