Contexte :
Je crée une application composée d'un noyau et de plusieurs modules. Les modules sont des moteurs Rails, et fournissent la fonctionnalité réelle car le noyau lui-même ne fait que servir d'hôte. Les moteurs sont hébergés dans /lib
et montés à leurs chemins respectifs.
coreApp
lib
module1
module2
etc
Les modules sont ensuite montés de cette manière :
mount Module1::Engine => "/module1", :as => "module1"
mount Module2::Engine => "/module2", :as => "module2"
Le noyau est également responsable de la gestion de la session, bien que la connexion elle-même soit effectuée par un module.
Problème :
Je n'ai pas encore trouvé de bonne manière de partager la mise en page de l'application principale avec les moteurs. Voici comment je mets actuellement la mise en page à disposition des moteurs :
coreApp
app
views
layouts
application.html.erb
core.html.erb
Le fichier core.html.erb
contient uniquement :
<%= render :template => 'layouts/application' %>
Il est ensuite inclus dans chaque module de cette manière :
module Module1
class ApplicationController < ActionController::Base
layout "core"
end
end
Bien que ce ne soit pas particulièrement élégant, cela fonctionne bien, et le contenu du module est rendu là où se trouve l'instruction yield
dans la mise en page de l'application.
Les problèmes sont les suivants :
1. Les feuilles de style spécifiques au module ne sont pas incluses dans l'en-tête
J'ai besoin d'une manière d'inclure les feuilles de style du module actif.
2. L'en-tête a besoin d'accéder aux informations concernant l'utilisateur connecté
L'en-tête contient des informations sur l'utilisateur connecté, comme
Connecté en tant que <%= @user[:realname] %>
Cela provient du home_controller
du noyau
def index
@user = User.find_by_id(session[:user])
end
Mais lorsque j'essaie d'accéder au module, j'obtiens l'erreur suivante
NoMethodError dans Module1/home#index
Vous avez un objet nul lorsque vous ne vous y attendiez pas !
Vous avez peut-être attendu une instance de Array.
L'erreur s'est produite en évaluant nil.[]
Manifestement, cela fait référence à @user
.
Question :
Comment résoudre cela de manière aussi élégante et DRY que possible sans trop toucher au côté moteur ?
J'ai beaucoup cherché sur Google, mais je ne parviens pas vraiment à comprendre comment résoudre cela. Il se peut que cela soit dû à un manque total de compréhension du fonctionnement de Rails, donc il y a de fortes chances que cette question ne soit même pas logique pour quelqu'un qui connaît bien Rails.
N'hésitez pas à commenter si quelque chose n'est pas clair ou ambigu, et j'essaierai d'élaborer.