23

我已经阅读了很多关于该主题的内容,但似乎没有什么能完全满足我的需求。如果我重复或不清楚我对 ruby​​ 和 rails 以及 stackoverflow 都是新手,我很抱歉。

我有一个现有的 Rails 应用程序,里面有很多基础设施。我想获取其中的一些模型,将它们嵌套在命名空间中,然后将所有这些放入 ruby​​ gem 中,以便在其他 Rails 应用程序中使用。据我了解,导轨的加载路径存在问题,因为它们是一种约定,并且定义另一个引擎时存在问题,因为您有两个并且它们崩溃了。

我一直在寻找指南或教程来学习如何在没有太多运气的情况下做到这一点,但我很肯定如果有人能指出我的话,那里会有一些很棒的东西。

我用引擎制作宝石的尝试因碰撞或缺少铁轨而失败。

我正在运行 rails 3.2.3 和 ruby​​ 1.9.3。

4

2 回答 2

24

是的,您可以创建一个包含模型的 gem,并将它们包含在多个 Rails 应用程序中。这是一种方法:

  • 创建一个宝石:bundle gem demo_gem

  • 创建模型或将模型移动到 demo_gem。我更喜欢将它们放在gem 的lib/文件夹中,例如demo_gem/lib/app/models/student.rb

    module DemoGem
      class Student < ActiveRecord::Base
      end
    end
    
  • 需要demo_gem/lib/demo_gem.rb中的所有模型

    require "demo_gem/version"
    require "demo_gem/app/models/student.rb"
    module DemoGem
      # Your code goes here...
    end
    
  • 在您的 Rails 应用程序Gemfile中包含 gem (我假设您的代码不是开源的,并且您不打算发布 gem):

    gem 'demo_gem', path: '../demo_gem'
    

现在,您可以在多个 Rails 应用程序中的任何地方使用这些模型,只需使用DemoGem::Student.

这里假设您使用的是单个数据库并且表存在。但是,您可以在 gem 本身中创建迁移并使用Rails 生成器将它们复制到应用程序。

于 2015-07-29T13:27:10.920 回答
1

从本手册开始 - http://guides.rubyonrails.org/engines.html

使用命令创建引擎

$ rails plugin new "EngineName" --mountable

比把你需要的所有东西、模型、控制器等都放入你的引擎中。从中生成宝石。将此 gem 添加到您的 MasterApp。所有模型都将在 EngineName 命名空间下可用。

于 2014-07-22T01:38:20.020 回答