背景
我正在创建一个由一个核心和几个模块组成的应用程序。这些模块是 rails 引擎,并提供实际功能,因为核心本身仅充当主机。引擎从它们各自的路径托管/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' %>
然后像这样包含在每个模块中
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
。
问题
如何在不对发动机侧进行过多篡改的情况下尽可能优雅和干燥地解决这个问题?
我已经用谷歌搜索了很多,但无法真正了解如何解决它。可能完全缺乏对 Rails 工作原理的了解,所以这个问题很可能对于熟悉 Rails 的人来说甚至没有意义。
如果有任何不清楚或模棱两可的地方,请发表评论,我会尽力详细说明。