Механизм рендеринга в макете приложения

Предыстория

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

Проблемы заключаются в следующем:

1. Таблицы стилей конкретного модуля не включены в заголовок

Мне нужен способ включения таблиц стилей активного модуля.

2.Заголовку нужен доступ к информации о вошедшем в систему пользователе

Заголовок содержит информацию о вошедшем в систему пользователе, например

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.

Вопрос

Как можно решить эту проблему максимально элегантно и СУХО без особых изменений со стороны двигателя?

Я много гуглил, но не могу понять, как решить эту проблему. Это может быть полное отсутствие понимания того, как работает рельсы, поэтому есть большая вероятность, что этот вопрос не имеет смысла даже для того, кто хорошо знает рельсы.

Прокомментируйте, если что-то неясно или двусмысленно, и я постараюсь уточнить.

30
задан Jørgen R 9 November 2015 в 20:08
поделиться