我想在我的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
我尝试使用以下方法包含模型:
app/models
目录并将我的模型放入他们两个都失败了,然后我决定采用引擎建议(只需将--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
答案 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'
这应该足够了