rails 3.1.1引擎 - 使用可安装的引擎,是否可以访问父app资产,默认布局?

Spa*_*asm 6 rails-engines ruby-on-rails-3 ruby-on-rails-3.1

这更多是为了实验 - 我知道我可以用--full这样做但我想在应用程序中使用命名空间的功能以避免冲突

想法是有一个主应用程序 - 处理身份验证,常见项目,管理屏幕等然后创建引擎以添加更多功能,如

  • CRM
  • CMS
  • 博客
  • 维基
  • 论坛
  • 等等

这些引擎我可以挑选我正在构建的任何类型的应用程序.这可能吗?

是否只应用--mountable和--full选项?

试验 - 如果我使用完整选项添加rspec然后简单添加会有任何问题

rails plugin new plugin_name --skip-test-unit --full --dummy-path=spec/dummy
Run Code Online (Sandbox Code Playgroud)

在lib\plugin_name\engine.rb中

module PluginName
  class Engine < Rails::Engine

    # this is added by rails when an engine is mountable 
    # to isolate the plugin and prevent name clashes
    isolate_namespace PluginName

    # one of the additions to make rspec work from command line for the plugin
    config.generators do |g|
      g.test_framework :rspec, :view_specs => false
    end   
  end
end 
Run Code Online (Sandbox Code Playgroud)

我已经创建了--full和--mountable引擎,并且让rspec最终为任何人阅读都有一些很棒的文章(见下文),但是想知道这对我正在尝试创建的解决方案的影响更大

我仍在玩这个并将发布我的调查结果..
任何帮助/讨论将受到大力赞赏.

请注意

  1. 为什么我要这样做 - 建立一次使用多次...
  2. 我永远不会希望非技术/客户端添加"插件/引擎" - 这纯粹是为了娱乐点1.

我遇到的问题......

  1. 在顶级应用程序上运行服务器.只有当从引擎访问内容时,(我可以通过错误消息看到)我有路由问题(root_path未定义或设计缺少路由) - 正在呈现父应用程序布局,我可以在提取的错误源中看到它.进展但还没有雪茄!

有用的参考资料

Spa*_*asm 2

我设法通过以下步骤使其工作:

  1. 在我的父应用程序中,我将引擎安装在 paths.rb 中

    mount PluginName::Engine => '/plugin_name'
    
    Run Code Online (Sandbox Code Playgroud)

    我刚刚把它删除了。

  2. 创建一个应用程序控制器,如下 Ryan Bigg 所说。

    class PluginName::ApplicationController < ApplicationController
      ...
    end
    
    Run Code Online (Sandbox Code Playgroud)
  3. isolate_namespace PluginName因为我希望在生成控制器、模型、测试时有名称空间,所以当我希望 gem 在父应用程序中运行时,您必须注释掉lib\plugin_name\engine.rb 。

    这还不是一个理想的解决方案。从我的头脑中,我可以使用类似的东西:

    isolate_namespace PluginName if %w[development testing].include?(Rails.env)
    
    Run Code Online (Sandbox Code Playgroud)

    但必须测试这是否实用。

感谢 Ryan 帮助我找到了方向,非常感谢

此外,使用 --mountable 开关版本也可以完成同样的操作,您所需要做的就是在引擎中进一步执行 config/routes.rb 替换

PluginName::Engine.routes.draw do
Run Code Online (Sandbox Code Playgroud)

Rails.application.routes.draw do
Run Code Online (Sandbox Code Playgroud)