【问题标题】:How to pass the session variables from one rails 3.2.8 engine to another engine?如何将会话变量从一个 rails 3.2.8 引擎传递到另一个引擎?
【发布时间】:2012-12-17 03:17:12
【问题描述】:
在我们的 rails 3.2.8 应用程序中,有一个可挂载的身份验证引擎,它处理用户身份验证并为整个应用程序生成会话变量。当我们将 authentify 与另一个 Rails 引擎 rfqx 集成时,引擎 rfqx 需要访问由引擎 authentify 生成的会话变量。问题是会话变量在引擎 rfqx 中不可用并且为零。
在rfqx的routes.rb中,authentify挂载如下:
mount Authentify::Engine => "/authentify"
我们如何使会话变量在引擎 rfqx 中可用?
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3.2
rails-engines
【解决方案1】:
来自Rails Edge guide:
4.3.2 使用应用程序提供的控制器
因为 Rails 控制器通常共享用于身份验证和访问会话变量之类的代码,默认情况下它们继承自 ApplicationController。然而,Rails 引擎的作用域是独立于主应用程序运行,因此每个引擎都有一个作用域 ApplicationController。此命名空间可防止代码冲突,但引擎控制器通常应访问主应用程序的 ApplicationController 中的方法。提供此访问权限的一种简单方法是将引擎的作用域 ApplicationController 更改为从主应用程序的 ApplicationController 继承。对于我们的 Blorgh 引擎,这将通过将 app/controllers/blorgh/application_controller.rb 更改为如下所示来完成:
class Blorgh::ApplicationController < ApplicationController
end
默认情况下,引擎的控制器继承自 Blorgh::ApplicationController。因此,在进行此更改后,他们将可以访问主应用程序 ApplicationController,就好像它们是主应用程序的一部分一样。
此更改确实要求引擎从具有 ApplicationController 的 Rails 应用程序运行。