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

时间:2015-07-09 16:16:50

标签: 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

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

  1. 只需创建一个app/models目录并将我的模型放入
  2. 正如this tutorial中建议的那样(我可以在devise's github中看到),我创建了一个生成器来尝试生成模型。
  3. 他们两个都失败了,然后我决定采用引擎建议(只需将--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
    

1 个答案:

答案 0 :(得分:1)

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

在考虑了一下之后,我相信你需要一个引擎,原因是,一个简单的模型仍然需要迁移。请注意,引擎基本上是一个宝石加上一些由rails提供的附加功能。

虽然miguiding(不再使用rails中的插件),但命令rails plugin new blorgh --mountable会创建一个 gem ,这是一个rails引擎。

您如何理解宝石是否是轨道引擎?通过文件engine.rb(可以不同的名称命名,内容是重要的东西)。

module Blorgh
  class Engine < ::Rails::Engine
    isolate_namespace Blorgh
  end
end

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

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

你准备好了。一个说明!要安装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'

这应该足够了