Ruby on rails学习:开发自己的 rails 插件

在用rails开发的过程中,经常会遇到一些重复的模块,我们可以考虑开发成 rails 插件,以便于在多个项目之间进行复用
更新于: 2022-03-16 13:50:43
rails engine开发

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")

最终的diagram如下

数据库diagram

参考