5

同じ構造を持ついくつかのモデルを持つ Rails アプリがあります。

class Item1 < ActiveRecord::Base
  WIDTH = 100
  HEIGHT = 100
  has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
  validates_attachment :image, :presence => true
end


class Item2 < ActiveRecord::Base
  WIDTH = 200
  HEIGHT = 200
  has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
  validates_attachment :image, :presence => true
end

実際のコードはもっと複雑ですが、簡単にするためにはこれで十分です。

コードの共通部分を 1 か所にまとめて、すべてのモデルで使用できると思います。

これが私の頭に浮かぶものです:

class Item1 < ActiveRecord::Base
  WIDTH = 100
  HEIGHT = 100
  extend CommonItem
end

module CommonItem
  has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
  validates_attachment :image, :presence => true
end

明らかに、次の 2 つの理由で機能しません。

  1. CommonItem私が呼び出すクラスメソッドについてはわかりません。
  2. WIDTHおよびHEIGHT定数は のCommonItem代わりに検索されますItem1

includeの代わりに、クラス継承extendのいくつかの方法を使用しようとしましたが、どれも機能しません。class_eval

明らかな何かが欠けているようです。何を教えてください。

4

2 に答える 2

3

これが私がそれを行う方法です:

class Model
  def self.model_method
    puts "model_method"
  end
end

module Item
  def self.included(base)
    base.class_eval do
      p base::WIDTH, base::HEIGHT
      model_method
    end
  end
end

class Item1 < Model
  WIDTH = 100
  HEIGHT = 100
  include Item
end

class Item2 < Model
  WIDTH = 200
  HEIGHT = 200
  include Item
end

includedメソッドは、モジュールが含まれているときに呼び出されます。

あなたの問題と同様の構造を作成できたと思います。モジュールは、クラスから項目クラスによって継承されたメソッドを呼び出していますModel

出力:

100
100
model_method
200
200
model_method
于 2012-11-11T17:15:00.700 に答える
2

Ruby では、繰り返されるコードを 1 つのユニットに抽出するために使用する構造はメソッドです。

class Model
  def self.model_method
    p __method__
  end

  private

  def self.item
    p self::WIDTH, self::HEIGHT
    model_method
  end
end

class Item1 < Model
  WIDTH = 100
  HEIGHT = 100
  item
end

class Item2 < Model
  WIDTH = 200
  HEIGHT = 200
  item
end
于 2012-11-11T17:37:51.413 に答える