Ruby on rails 创建包含rails模型的gem

Ruby on rails 创建包含rails模型的gem,ruby-on-rails,plugins,model,gem,rails-engines,Ruby On Rails,Plugins,Model,Gem,Rails Engines,关于这个话题,我读了很多书,但似乎没有什么能完全满足我的需要。很抱歉,如果我重复或不清楚我对ruby和rails都是新手,对stackoverflow也是新手 我有一个现有的rails应用程序,其中包含很多基础设施。我想将它的一些模型嵌套在一个名称空间中,并将所有这些放入RubyGem中,以便在其他rails应用程序中使用。据我所知,rails的加载路径有一个问题,因为它们是一个约定,定义另一个引擎也有一个问题,因为有两个引擎,它们会崩溃 我一直在寻找一个指南或教程来学习如何在没有太多运气的情况

关于这个话题,我读了很多书,但似乎没有什么能完全满足我的需要。很抱歉,如果我重复或不清楚我对ruby和rails都是新手,对stackoverflow也是新手

我有一个现有的rails应用程序,其中包含很多基础设施。我想将它的一些模型嵌套在一个名称空间中,并将所有这些放入RubyGem中,以便在其他rails应用程序中使用。据我所知,rails的加载路径有一个问题,因为它们是一个约定,定义另一个引擎也有一个问题,因为有两个引擎,它们会崩溃

我一直在寻找一个指南或教程来学习如何在没有太多运气的情况下做到这一点,但我相信,如果有人能告诉我,这将是非常棒的

我试图用一个引擎制作一个gem,但在碰撞或缺少轨道时失败了

我正在运行rails 3.2.3和ruby 1.9.3。

从本手册开始-

使用comand创建引擎

$ rails plugin new "EngineName" --mountable
而不是把所有你需要的,模型,控制器,e.t.c放进你的引擎里。从中生成gem。
将此宝石添加到您的MasterApp。所有模型都将在EngineName命名空间下可用。

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

  • 创建gem:
    捆绑gem demo\u gem

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

  • 在Rails应用程序gem文件中包含gem(我假设您的代码不是开源的,并且您不打算发布gem):

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


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

您描述的问题通常通过将代码重构到新的Rails引擎来解决。你是如何尝试创建引擎的,以及你到底遇到了什么错误?作为一个指南,你有没有看过或?我会尝试更好地描述我正在尝试做什么:我已经为基本Rails教程(博客)制作了一个示例应用程序,其中包含帖子、评论和标签。现在假设我想把标签做成一个gem,这样任何Rails应用程序都可以在任何模型上添加标签。我尝试做的是制作一个包含所有标记(模型、部分、迁移)的gem,然后我安装了所述gem,然后当我需要它时,我会被抛出,例如,如果我运行irb(在另一个注释中发布输出,因为我不需要characters1.9.3p194:001>需要“tag\u model\u gem”NameError:uninitialized constant TagModelGem::Rails 1.9.3p194:002>需要“Rails”=>true 1.9.3p194:003>需要“tag\u model\u gem”TypeError:您所描述的内容应该可以正常工作,我一直都在这样做。因此,您可能做了一些不太正确的事情。对不起,我不完全理解您遇到的问题的本质。但是您尝试做的事情是可能的、正常的,并且正常工作。问题不仅仅是如何做出正确的决定可安装的插件,但包括添加到所述插件并使其在后台安静工作的内容。只要在您显示的一个文件中有所有类,我就可以让它工作。我尝试将它们放在lib/.demo\u gem/版本文件所在的位置,我得到未初始化的常量DemoGem::Theresa。它在lib/demo\u gem/Theresa.rb中定义。我把require放在demo_gem.rb文件中。如果我把它作为一个类放在模块的demo_gem.rb文件中,就可以了。我有40多个文件想在gem中作为模型使用。我缺少什么?
module DemoGem
  class Student < ActiveRecord::Base
  end
end
require "demo_gem/version"
require "demo_gem/app/models/student.rb"
module DemoGem
  # Your code goes here...
end
gem 'demo_gem', path: '../demo_gem'