Ruby on rails学习:开发自己的 rails 插件
在用rails开发的过程中,经常会遇到一些重复的模块,我们可以考虑开发成 rails 插件,以便于在多个项目之间进行复用
Rails engine:
引擎可以被认为是为其宿主应用程序提供功能的微型应用程序。
Rails
应用程序实际上只是一个“增压”引擎,Rails::Application
类继承了Rails::Engine
的许多行为。因此,引擎和应用程序可以被认为是几乎相同的东西,只是有细微的差别,正如您将在本指南中看到的那样。引擎和应用程序也共享一个共同的结构。
新建插件
rails plugin new rails_taggable --mountable
添加 tag/tagging 表的 migration
rails g model Tag name:string code:string
rails g model Tagging tag:references taggable:references{polymorphic}
特别注意,如果这里是开发 plugin
,需要改变 table_name
foreign_key: { to_table: :rails_taggable_tags }
class CreateRailsTaggableTaggings < ActiveRecord::Migration[6.0]
def change
create_table :rails_taggable_taggings do |t|
t.references :tag, null: false, foreign_key: { to_table: :rails_taggable_tags }
t.references :taggable, polymorphic: true, null: false
t.timestamps
end
end
end
models目录结构
.
├── concerns
│ └── rails_taggable
│ └── taggable.rb
└── rails_taggable
├── application_record.rb
├── tag.rb
└── tagging.rb
3 directories, 4 files
添加一个 config
require "rails_taggable/engine"
module RailsTaggable
self.mattr_accessor :models
self.models = []
# add default values of more config vars here
# this function maps the vars from your app into your engine
def self.setup(&block)
yield self
end
end
在 dummy app 里添加配置
文件就位于test目录下:
/test/dummy/config/initializers/rails_taggable.rb
RailsTaggable.setup do |config|
config.models = ['Post', 'Album']
end
自定义generator
rails g generator rails_taggable/install
测试一下实现
p1 = Post.create(title:'js.work', content:'aric的小站')
p1.tags << RailsTaggable::Tag.create(name:"post")