Ruby On Rails中铁路和引擎之间的差异3

时间:2011-06-27 19:23:42

标签: ruby-on-rails-3 ruby-on-rails-plugins rails-engines railtie

我读了一些关于这些论点的文件,但我不明白它们是什么,它们之间有什么区别,如果其中一个符合我的需要。

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

我是在正确的路上吗?

我应该阅读什么才能理解如何做到这一点?

更新

可以找到一篇包含很多详细信息的非常好的文章here

本质:

  

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

     

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

2 个答案:

答案 0 :(得分:7)

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

Read this blog for more info

答案 1 :(得分:4)

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

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

  • 设置了一些初始值设定项(借助initializer方法):将引擎的Rails app类文件夹结构加载到真实应用中,以便

      

    引擎会自动将app/modelsapp/controllersapp/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]