创建包含轨道模型的 gem

问题描述 投票:0回答:2

我已经阅读了很多有关该主题的文章,但似乎没有什么能完全满足我的需求。如果我重复或不清楚某些事情,我很抱歉,因为我既是 ruby 和 Rails 的新手,也是 Stack Overflow 的新手。

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

我一直在寻找指南或教程来学习如何做到这一点,但运气不佳,但我确信那里有一些东西;如果有人能指出我的话那就太好了。

我尝试用引擎制作 gem,但因碰撞或缺少 Rails 而失败。

我正在运行 Rails 3.2.3 和 Ruby 1.9.3。

ruby-on-rails plugins model rubygems rails-engines
2个回答
26
投票

是的,您可以创建包含模型的 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
    
  • 将 gem 包含在您的 Rails 应用程序中Gemfile(我假设您的代码不是开源的,并且您不打算发布 gem):

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

现在您可以在多个轨道应用程序中的任何地方使用这些模型,只需使用

DemoGem::Student

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


1
投票

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

使用命令创建引擎

$ rails plugin new "EngineName" --mountable

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

© www.soinside.com 2019 - 2024. All rights reserved.