在两个应用程序之间共享一个mongoid模型 - 使用引擎与插件

ben*_*ams 11 ruby-on-rails ruby-on-rails-plugins rails-engines

我想在我的rails应用程序之间共享2个(可能更多)之间的模型.我找不到任何明确的建议,但我找到了一些我已阅读过的问题和答案,并得出结论,必须使用"gemmed"插件引擎.我决定使用插件,因为我读到引擎只是一种"完整"的插件.

所以我使用以下方法创建了一个插件:( rails plugin new my_models --skip-active-record --skip-test-unit --dummy-path=spec/dummy选项用于跳过activerecord作为ORM并使用rspec进行测试).

创建插件后,我收到了以下文件:

my_models.gemspec  Gemfile  Gemfile.lock  lib  MIT-LICENSE  Rakefile  README.rdoc  spec
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法包含模型:

  1. 只需创建一个app/models目录并将我的模型放入其中
  2. 正如本教程中所建议的那样(我可以在devise的github中看到),我创建了一个生成器来尝试生成模型.

他们两个都失败了,然后我决定采用引擎建议(通过添加--mountable到"rails new"命令的选项列表),我得到了完整的rails应用程序结构(使用app,bin,db和其余的目录),把我的模型放在app/models目录中,它就像魔术一样!

因为我相信我是程序员而不是魔术师,所以我不会做这样的魔法,所以你能告诉我我的两个瘦插件解决方案(使用生成器/创建模型)有什么问题吗?而且,使用这些发电机有什么好处?

我附加了我的生成器代码,也许我想念一些东西:

require 'rails/generators/named_base'
require 'mongoid'

module Mongoid
  module AttackGenerator
    def generate_model
      invoke "mongoid:model", [name] unless model_exists? && behavior == :invoke
    end

    def inject_field_types
      inject_into_file model_path, migration_data, after: "include Mongoid::Document\n" if model_exists?
    end

    def migration_data
      field :link_url, type: String
      field :token, type: String
    end

    def model_exists?
      File.exists?(File.join(destination_root, model_path))
    end

    def model_path
      @model_path ||= File.join("app", "models", "#{file_path}.rb")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Fir*_*DoL 0

引擎(非常好的指南)基本上是一个小型 Rails 应用程序:具有控制器,可以各种方式注入您的 Rails 代码(共享类/控制器等),最重要的是,可以透明地使用您的主 Rails 应用程序代码。

想了一下,我相信你需要一个引擎,原因是,一个简单的模型仍然需要迁移。请注意,引擎基本上是一个 gem 加上 Rails 提供的一些附加功能。

尽管miguiding(rails中的插件不再使用),该命令rails plugin new blorgh --mountable创建了一个gem,它是一个rails引擎。

你如何理解 gem 是否是 Rails 引擎?通过文件engine.rb(可以不同的命名,内容是重要的东西)。

module Blorgh
  class Engine < ::Rails::Engine
    isolate_namespace Blorgh
  end
end
Run Code Online (Sandbox Code Playgroud)

您应该注意的另一件重要的事情是,当您将自定义 gem 添加到 gemfile 时,rails(实际上Bundler.require)自动require为您提供了一个文件:名为 的文件lib/yourgemname.rb,在本例中为lib/blorgh.rb. 这就是你的切入点。除此之外,所有其他东西(gemspec 和所有其他文件)都是为 ruby​​gems 创建的东西。重要的是您使用.gemspecfile 作为 gemfile,只需使用add_dependency而不是标准 Gemfile 语法添加 gem。如果您想(并且应该)了解有关红宝石宝石的更多信息,这篇文章非常好

app目录像 Rails 一样自动加载,因此添加app/models/yourmodel.rb是自动加载模型并与所有应用程序共享的好方法。最后一件重要的事情是迁移。您必须记住在 Rails 应用程序中运行,将迁移从引擎复制到 Rails 应用程序并运行它们(否则您可以看到本文your_engine_name:install:migrations中的建议)

你已经准备好了。一注!要安装 gem,您有两个选择:使用远程 git 存储库(最佳选择)或进行本地开发,您可以使用:path,这里有两个可以添加到 Rails 应用程序 gemfiles 中的示例:

# Use this only for development purposes
gem 'yourgem', '1.0.0', path: 'your/local/path/to/gem'

# Use this for deploy and such, you'll need access to that repository
gem 'yourgem', '1.0.0', git: 'yourgiturl'
Run Code Online (Sandbox Code Playgroud)

这应该足够了