コードをもう一度確認してください...
モジュール構造は次のようになります (確実に機能する私のプロジェクトの 1 つから取得)。
# lib/taggable.rb
require 'active_support/concern'
module Taggable
extend ActiveSupport::Concern
module ClassMethods
def taggable
include TaggableMethods # includes the instance methods specified in the TaggableMethods module
# class methods, validations and other class stuff...
end
end
module TaggableMethods
# instance methods...
end
end
不足しているのは、Rails にlib
ディレクトリからモジュールをロードするように指示する必要があることです。
# config/application.rb
module AppName
class Application < Rails::Application
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
config.autoload_paths += %W(#{config.root}/lib)
# rest ommited...
これでモジュールがインクルードされます。
# model.rb
class Model
taggable
end
これが基本的なプラグインの仕組みです。質問で言及されているチュートリアルの作成者は、ActiveRecord::Base
特定のメソッドを使用しているため、から継承するモデルのみに固有のプラグインを作成します (例: update_column
)。
モジュールが ActiveRecord メソッドに依存していない場合、モジュールを拡張する必要はありません (モジュールは Mongoid モデルでも使用できます)。しかし、これは間違いなく正しい方法ではありません:
class ActiveRecord::Base
include HasDefault
end
ActiveRecord を拡張する必要がある場合は、次のようにします。
ActiveRecord::Base.extend ModuleName
もちろん、必要に応じてプラグインを作成する方法は他にもたくさんあります。さまざまなレールを参考にしてくださいgems
。