【问题标题】:Creating a gem that contains rails models创建一个包含 rails 模型的 gem
【发布时间】:2012-08-09 16:37:17
【问题描述】:

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

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

我一直在寻找指南或教程来学习如何做到这一点,但运气不佳,但我很肯定如果有人能指出我的话,那将会很棒。

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

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

【问题讨论】:

  • 您所描述的问题通常可以通过将代码重构到新的 Rails 引擎来解决。你是如何尝试创建引擎的,你到底遇到了什么错误?
  • 作为指南,你看过thisthis吗?
  • 我将尝试更好地描述我正在尝试做的事情:我已经为基本的 Rails 教程(博客)制作了带有帖子、cmets 和标签的示例应用程序。现在说我想获取标签并将其制作成一个 gem,这样任何 Rails 应用程序都可以将标签添加到任何模型上。我尝试做的是制作一个包含所有标签(模型、部分、迁移)的 gem,然后我安装了该 gem,然后当我需要它时,我会被抛出,例如,如果我运行 irb(在另一条评论中发布输出,因为我是去掉字符
  • 1.9.3p194 :001 > 需要 "tag_model_gem" NameError: 未初始化的常量 TagModelGem::Rails 1.9.3p194 :002 > 需要 "rails" => true 1.9.3p194 :003 > 需要 "tag_model_gem" TypeError : 已经初始化的类
  • 你所描述的应该只是工作,我一直这样做。因此,您可能正在做一些不太正确的事情。我不完全理解您遇到的问题的性质,抱歉。但是您尝试做的事情是可能的,正常的,并且通常有效。

标签: ruby-on-rails plugins model gem rails-engines


【解决方案1】:

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

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

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

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

【讨论】:

  • 只要我在您显示的一个文件中包含所有类,我就可以让它工作。我尝试将它们放在版本文件所在的 lib/.demo_gem/ 中,我得到未初始化的常量 DemoGem::Theresa。它在 lib/demo_gem/theresa.rb 中定义。我将要求放在 demo_gem.rb 文件中。如果我把它作为一个类放在模块中的 demo_gem.rb 文件中就可以了。我有 40 多个文件想要作为 gem 中的模型提供。我错过了什么?
【解决方案2】:

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

使用命令创建引擎

$ rails plugin new "EngineName" --mountable

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

【讨论】:

  • 问题不只是如何制作一个可挂载的插件,还包括将东西添加到所述插件中并使其在后台静默工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多