创建包含rails模型的gem

Shr*_*ewd 22 gem plugins model ruby-on-rails rails-engines

我一直在阅读很多关于这个主题的内容,似乎没有什么能够满足我的需求.如果我重复或不清楚我对ruby和rails都是新手以及对stackoverflow的新手,我很抱歉.

我有一个现有的rails应用程序,里面有很多基础设施.我想采用它的一些模型,将它们嵌套在命名空间中,并将所有这些放入ruby gem中,以便在其他rails应用程序中使用.根据我的理解,rails的加载路径存在问题,因为它们是惯例,而定义另一个引擎的问题是因为你有两个并且它们会崩溃.

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

我尝试使用引擎制作宝石会因碰撞或缺少导轨而失败.

我正在运行rails 3.2.3和ruby 1.9.3.

vik*_*kas 21

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

  • 创建一个gem: bundle gem demo_gem

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

    module DemoGem
      class Student < ActiveRecord::Base
      end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  • 需要demo_gem/lib/demo_gem.rb中的所有模型

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

    gem 'demo_gem', path: '../demo_gem'
    
    Run Code Online (Sandbox Code Playgroud)

现在,您只需使用即可在多个rails应用程序中的任何位置使用这些模型DemoGem::Student.

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


小智 2

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

使用命令创建引擎

$ rails plugin new "EngineName" --mountable
Run Code Online (Sandbox Code Playgroud)

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

  • 问题不仅仅是如何制作一个可安装的插件,还涉及将一些东西添加到所述插件中并使其在后台默默工作。 (2认同)