繁体   English   中英

“常规”Ruby gem或Rails引擎?

[英]“Regular” Ruby gem or Rails engine?

我的Rails应用程序(Rails 3和4的编译)都有自己的数据库(自然),但也访问第三方数据库。 因此,他们拥有此第三方数据库的模型。 我想干掉这些模型以便可重复使用,而不是在每个应用程序中复制粘贴它们。 没有要考虑的控制器,帮助器或路线; 只有型号。 但由于它有Rails“部件”,这似乎表明我需要一个引擎。 但是我想在所有应用程序中使用这些模型这一事实似乎只需要一个“正常”的rails兼容宝石。

将它作为gem或Rails引擎更好吗?

如果发动机更好,我不太清楚从哪里开始。 从我读过的一些指南中,似乎你在一个新的Rails应用程序上创建了一个引擎。 我对fullmountable也有点不清楚,但我知道我希望这些模型在他们自己的命名空间中。

最后,我希望这些模型可用于我的所有应用程序。 发动机可以打包成宝石,对吗? 如果是这样,那么我不能只是作为一个宝石开始,而不是作为一个特定的应用程序内的引擎开始,然后在事后导出宝石?

我很困惑,所以任何反馈都表示赞赏。 我以前也从未制造过宝石或发动机,所以请原谅这方面的任何愚蠢。

发动机实际上并不那么神奇,虽然很容易获得这种印象。 最简单的是,“引擎”是Rails::Engine一个子类。 一旦它被Rails应用程序加载(例如require 'yourgem/engine ), require 'yourgem/engine的方法就会执行并将引擎连接到Rails应用程序(包括将引擎内的一堆路径神奇地附加到应用程序的负载路径,这是您的引擎模型和控制器加载到您的应用程序的方式)。

现在,如果您已经尝试阅读Rails Engines入门 ,您可能会认为除非使用Rails生成器,否则无法创建引擎,并坚持使用Rails约定,以及所有这些。 但这一切都是可选的! 我个人建议创建一个普通的gem并将其转换为引擎,主要是通过阅读API文档 ,这些文档更加实际。 甚至可以覆盖在gem中拥有app文件夹的建议模式,以保存模型和控制器等等(请参阅API文档中的Paths部分)。

所以在你的情况下,你希望你的引擎只包含模型,我建议像这样的宝石布局:

yourgem/
  app/
    models/
      yourgem/
        your_thing.rb
  db/
    migrate/
      20160413010101_create_models.rb
  lib/
    yourgem/
      engine.rb
      version.rb
    yourgem.rb
  yourgem.gemspec

你的engine.rb非常简单:

# lib/yourgem/engine.rb
module YourGem
  class Engine < ::Rails::Engine
    isolate_namespace YourGem # this is generally recommended

    # no other special configuration needed. But maybe you want
    # an initializer to be added to the app? Easy!
    initializer 'yourgem.boot_stuff_up' do
      YourGem.boot_something_up!
    end
  end
end

并且您的迁移和模型看起来很正常(但请记住您的模型必须在您的宝石名称范围内,以避免与可能使用此引擎的任何应用程序冲突)。

希望有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM