我读了一些关于这些论点的文件,但我不明白它们是什么,它们之间有什么区别,如果其中一个符合我的需要。
我需要编写一个可插入其他应用程序的应用程序,并希望将其作为gem包含在其他应用程序中。基本上我需要一些模型,一个控制器和没有视图,加上一些初始化,支持来自托管应用程序和生成器的配置参数。
我是在正确的路上吗?
我应该阅读什么才能理解如何做到这一点?
更新
可以找到一篇包含很多详细信息的非常好的文章here。
本质:
Railtie是Rails框架的核心,它提供了几个钩子来扩展Rails和/或修改初始化过程。
Rails :: Engine只不过是已经设置了一些初始化程序的Railtie。由于Rails :: Application和Rails :: Plugin是引擎,因此这里描述的相同配置可以用于所有三个。
答案 0 :(得分:7)
Railtie可能会按照您的描述进行操作,但使用引擎可能更为可取。引擎可以有自己的配置,也可以像Rails应用程序一样,因为它允许您以与常规Rails应用程序相同的方式将/ app目录包含在控制器,视图和模型中。
答案 1 :(得分:4)
Rails::Engine
继承了Rails::Railtie
的所有功能,并添加了更多功能(Engine < Railtie
source code [来源中的文档非常好])。
基本上, railtie (==您继承自Rails::Railtie
的类)为您提供了与Rails应用程序进程交互所需的一切。
引擎(==您继承自Rails::Engine
的类)铁路 +
设置了一些初始值设定项(借助initializer
方法):将引擎的Rails app类文件夹结构加载到真实应用中,以便
引擎会自动将
app/models
,app/controllers
,app/helpers
加载到您的真实应用中,从config/routes.rb
加载路由,从{{加载语言环境1}},并从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]
。