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

时间:2011-10-11 08:35:01

标签: ruby-on-rails-3 ruby-on-rails-3.1 rails-engines

这更多用于实验 - 我知道我可以使用--full执行此操作,但我希望应用程序中的命名空间功能可以避免冲突

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

  • crm
  • cms
  • 博客
  • 维基
  • 论坛
  • etc

这些引擎我可以选择,因为我需要用于我正在构建的任何类型的应用程序。 这可能吗?

是否同时应用--mountable和--full选项?

试验 - 如果我使用完整选项添加rspec然后简单添加

,会有任何问题
rails plugin new plugin_name --skip-test-unit --full --dummy-path=spec/dummy

和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 

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

我还在玩这个并且会发表我的发现..
任何帮助/讨论都将受到大力赞赏。

请注意

  1. 为什么我要这样做 - 多次使用构建......
  2. 我绝不希望非技术/客户添加“插件/引擎” - 这纯粹是为了娱乐第1点。
  3. 我遇到的问题......

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

2 个答案:

答案 0 :(得分:2)

我设法通过以下步骤实现了这一步:

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

    mount PluginName::Engine => '/plugin_name'
    

    我刚删除它。

  2. 创建了一个应用程序控制器,正如Ryan Bigg所述。

    class PluginName::ApplicationController < ApplicationController
      ...
    end
    
  3. 因为我想在生成控制器,模型,测试时将内容命名为间隔所以当我希望运行gem时,你必须注释掉isolate_namespace PluginName lib \ plugin_name \ engine.rb父应用程序。

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

    isolate_namespace PluginName if %w[development testing].include?(Rails.env)
    

    但必须测试这是否合适。

  4. 感谢Ryan帮助我找到了许多感谢

    此外,使用--mountable switch版本也可以做同样的事情,你需要做的只是引擎中的另一个步骤config / routes.rb replace

    PluginName::Engine.routes.draw do
    

    Rails.application.routes.draw do
    

答案 1 :(得分:1)

是的,您可以通过在应用程序中引用它们来引用父应用程序资产,就像正常情况一样:

  <%= stylesheet_link_tag "application %>

虽然,不确定为什么你会这样做,因为......

我将以第二个问题的答案回答你的第一个问题。

要使用应用程序的布局,您需要修改引擎中的ApplicationController(命名空间)并让它继承引擎中的ApplicationController

然后,将使用引擎提供的布局为引擎提供控制器。我是doing this in my engine, forem

有一天,the Engines Guide将涵盖这一点,在撰写本文时,目前正在撰写。