1

既存のモデルにジェネリック メソッドのセットを追加する必要があります。このチュートリアルを見つけました:

http://chris-schmitz.com/extending-activemodel-via-activesupportconcern/

私の意見では、これが私が目指しているものです(モデルにいくつかのメソッドを追加するためにモデルに追加されるモジュールが必要です-一種のミックスイン)。

チュートリアルから単純なコピー ペーストを行っても、次のエラーが表示されます (これ以上の説明はありません)。

undefined method `key?' for nil:NilClass

私のモデルは次のようになります。

class Folder < ActiveRecord::Base  
  attr_accessible :name, :parent_id  

  has_default

  validates :name, presence: true
end

has_defaultを削除した瞬間、すべてが正常に戻ります

4

1 に答える 1

5

コードをもう一度確認してください...

モジュール構造は次のようになります (確実に機能する私のプロジェクトの 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

于 2012-10-27T13:42:03.113 に答える