6

这更多是为了实验 - 我知道我可以使用 --full 来做到这一点,但我希望应用程序中的命名空间功能以避免冲突

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

  • 客户关系管理
  • 厘米
  • 博客
  • 维基
  • 论坛
  • ETC

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

是否只是同时应用 --mountable 和 --full 选项的情况?

实验 - 如果我使用完整选项 add 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 未定义或缺少设计路由) - 正在呈现父应用程序布局,我可以在提取的错误源中看到它. 进步,但还没有雪茄!

有用的参考资料

4

2 回答 2

2

我设法通过以下步骤来解决这个问题:

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

    mount PluginName::Engine => '/plugin_name'
    

    我刚刚删除了它。

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

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

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

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

    但必须测试这是否实用。

感谢 Ryan 帮助我找到自己的路,非常感谢

此外,使用 --mountable 开关版本也可以做到这一点,您需要做的只是在引擎 config/routes.rb 替换中的进一步步骤

PluginName::Engine.routes.draw do

Rails.application.routes.draw do
于 2011-10-13T00:55:04.657 回答
1

是的,您可以像往常一样在应用程序中引用父应用程序资产:

  <%= stylesheet_link_tag "application %>

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

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

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

然后,引擎的控制器将使用引擎提供的布局。我正在我的引擎中执行此操作,前级

有一天,引擎指南将对此进行介绍,目前正在编写该指南。

于 2011-10-12T00:08:07.360 回答