2011-10-11 134 views
6

这是更多的实验 - 我知道我可以用--full做到这一点,但我想在应用程序中使用命名空间功能来避免冲突rails 3.1.1引擎 - 可安装引擎,是否可以访问父应用程序资产,默认布局?

这个想法是有一个主要的应用程序 - 处理认证,常见的物品,管理员屏幕等 然后创建引擎添加更多功能,例如

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

这些引擎我可以挑选我需要什么样的应用程序我建立。 这可能吗?

是否只是应用--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

问题我有...

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

有用的参考

+0

我失去了一些东西明显大量的... ...如果我从父复制的路由引擎的路线,它工作正常进行安装......做同样的 - 完全按照上面指定的路线不起作用 – Spasm

回答

2

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

  1. 在我父应用程序,我安装了发动机routes.rb中

    mount PluginName::Engine => '/plugin_name' 
    

    我只是删除它。

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

    class PluginName::ApplicationController < ApplicationController 
        ... 
    end 
    
  3. 正如我想有东西名称生成控制器,模型,测试时让你有基本上注释掉隔开isolate_namespace PluginName的lib \ PLUGIN_NAME \ engine.rb当我想要的宝石在父要运行应用程序。

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

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

    但将不得不测试这是否可行。

荣誉给瑞恩帮助我找到我的路非常感谢

此外,同样可以用--mountable版本切换来完成,所有你需要做的就是在你的引擎配置一个进一步的步骤/路线。RB取代

PluginName::Engine.routes.draw do 

Rails.application.routes.draw do 
+0

用这个保存了我的屁股。谢谢。 – codykrieger

1

是的,你可以refe只是引用它们在你的应用程序像正常伦斯父应用程序资产:

<%= stylesheet_link_tag "application %> 

虽然不知道你为什么会想这样做,因为......

我要回答你的第一个问题并回答你的第二个问题。

要使用应用程序的布局,您将需要修改引擎中的ApplicationController(这是命名空间),并使其在引擎中继承ApplicationController

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

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

+0

感谢您回复我,我已经阅读了您网络上点点点滴的文章。访问父资产只会是布局,但在我第一次尝试使用mountable时,这是不可能的,因为它们是完全独立的。 这就是为什么我想使用完整的选项,但仍然名称间距因此继承父应用程序,但名称间隔的应用程序。想知道会有什么影响..检查一下forem来收集一些信息。 – Spasm