0

仮想属性についてサポートが必要です。このコードは正常に機能しますが、プラグイン内でどのように使用しますか。目標は、プラグインを使用するすべてのクラスにこのメソッドを追加することです。

class Article < ActiveRecord::Base

  attr_accessor :title, :permalink

  def title
    if @title 
      @title
    elsif self.page
      self.page.title
    else 
      ""
    end
  end

  def permalink
    if @permalink
      @permalink
    elsif self.page
      self.page.permalink
    else
      ""
    end
  end
end

ありがとう

4

3 に答える 3

1

プラグインジェネレーターを実行して開始できます。

script/generate plugin acts_as_page

次に、それを定義acts_as_pageしてすべてのモデルに拡張するモジュールを追加できます。

# in plugins/acts_as_page/lib/acts_as_page.rb
module ActsAsPage
  def acts_as_page
    # ...
  end
end

# in plugins/acts_as_page/init.rb
class ActiveRecord::Base
  extend ActsAsPage
end

このようにして、acts_as_pageメソッドをすべてのモデルのクラスメソッドとして使用でき、そこで任意の動作を定義できます。あなたはこのようなことをすることができます...

module ActsAsPage
  def acts_as_page
    attr_writer :title, :permalink
    include Behavior
  end

  module Behavior
    def title
      # ...
    end

    def permalink
      # ...
    end
  end
end

そして、モデルでacts_as_pageを呼び出すと...

class Article < ActiveRecord::Base
  acts_as_page
end

属性を定義し、メソッドを追加します。もう少し動的にする必要がある場合(たとえば、メソッドが動作を変更する引数を取る必要がある場合)、このRailscastsエピソードacts_as_pageで提示するソリューションを試してください。

于 2009-08-11T15:08:35.090 に答える
0

このためのモジュールが必要なようです

# my_methods.rb 
module MyMethods
  def my_method_a
    "Hello"
  end
end

あなたはそれをあなたがそれを使用したいクラスに含めたいです。

class MyClass < ActiveRecord::Base
  include MyMethods
end

> m = MyClass.new
> m.my_method_a
=> "Hello!" 

モジュールでのミキシングの詳細については、こちらをご覧ください。必要に応じて、プラグインのどこにでもモジュールを配置できます。Railsがモジュールを見つけられるように、モジュールの名前が正しいことを確認してください。

于 2009-08-11T13:16:37.467 に答える
0

次のようなモジュール構造を作成し、次のYourPlugin::InstanceMethodsようにこのモジュールを含めます。

module YourPlugin
  module InstanceMethods
    # your methods
  end
end

ActiveRecord::Base.__send__(:include, YourPlugin::InstanceMethods)

__send__コードをRuby1.9と互換性のあるものにするために使用する必要があります。この__send__行は通常init.rb、プラグインのルートディレクトリのファイルに配置されます。

于 2009-08-11T13:49:49.437 に答える