29

我阅读了一些关于这些论点的文件,但我并不清楚它们是什么,它们之间有什么区别,以及其中一个是否符合我的需要。

我需要编写一个可以插入其他应用程序的应用程序,并且我想将它作为 gem 包含在其他应用程序中。基本上我需要几个模型,一个控制器,没有视图,加上一些初始化,支持来自托管应用程序和生成器的配置参数。

我走对了吗?

我应该阅读什么来了解如何做到这一点?

更新:

可以在这里找到一篇非常好的文章,其中包含很多细节。

本质上:

Railtie 是 Rails 框架的核心,它提供了几个钩子来扩展 Rails 和/或修改初始化过程。

Rails::Engine 只不过是一个已经设置了一些初始化程序的 Railtie。而且由于 Rails::Application 和 Rails::Plugin 是引擎,所以这里描述的相同配置可以在所有三个中使用。

4

2 回答 2

8

Railtie 可能可以按照您的描述进行,但使用引擎可能更可取。该引擎可以有自己的配置,也可以像 Rails 应用程序一样工作,因为它允许您以与常规 Rails 应用程序相同的方式将 /app 目录包含控制器、视图和模型。

阅读此博客了解更多信息

于 2011-06-28T19:22:00.903 回答
7

Rails::Engine继承了所有功能Rails::Railtie并添加了更多功能(Engine < Railtie源代码[源代码中的文档非常好])。

基本上,railtie(== 继承自的类Rails::Railtie)为您提供了与 Rails 应用程序进程交互所需的一切。
并且引擎(==您继承自的类Rails::Engine)是railtie +

  • 一些初始化设置(在方法的帮助下initializer):使你的引擎的 Rails 应用程序文件夹结构可以加载到真正的应用程序中,这样

    引擎会自动将 , 加载app/models到您的真实应用程序中app/controllersapp/helpers从 加载路线,从config/routes.rb加载语言环境config/locales/*,并从 加载任务lib/tasks/*

    您可以看到使用以下代码设置的初始化程序:

    require 'rails/all'
    Rails::Railtie.initializers.map(&:name) #=> []  
    Rails::Engine.initializers.map(&:name)  #=> [:set_load_path, :set_autoload_paths, :add_routing_paths, :add_locales, :add_view_paths, :load_environment_config, :append_assets_path, :prepend_helpers_path, :load_config_initializers, :engines_blank_point]
    
  • 一些方便的方法,例如isolate_namespace.

于 2015-11-24T17:30:57.830 回答