0

method or variable not definedモジュール内の関数で定義された配列を使用しようとすると、が発生します。

ファイルは次のとおりです。

/lib/states.rb

module States
  def fifty_states
    [
        'AL',
        'AK',
        'AZ',
        'AR',
        'CA',
        'CO',
        'CT',
        'DE',
        'FL',
        'GA',
        'HI',
        'ID',
        'IL',
        'IN',
        'IA',
        'KS',
        'KY',
        'LA',
        'ME',
        'MD',
        'MA',
        'MI',
        'MN',
        'MS',
        'MO',
        'MT',
        'NE',
        'NV',
        'NH',
        'NJ',
        'NM',
        'NY',
        'NC',
        'ND',
        'OH',
        'OK',
        'OR',
        'PA',
        'RI',
        'SC',
        'SD',
        'TN',
        'TX',
        'UT',
        'VT',
        'VA',
        'WA',
        'WV',
        'WI',
        'WY'
    ]
  end
end

/app/controller/player_to_team_histories_controller.rb

class PlayerToTeamHistory < ActiveRecord::Base
include States

def self.distinct_states
  joins(:player).select("DISTINCT players.HometownState").where("players.HometownState IN (?)", fifty_states)
end

コンソールを開くと、これをうまく行うことができます。

>> include States
Object

>> fifty_states
["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"]
4

1 に答える 1

2

ここでは、クラスとインスタンスを混同していると思います。クラスメソッド(つまり)fifty_statesの内部から呼び出したい場合は、ではなく、を使用する必要があります。self.distinct_statesextendinclude

module A
  def foo
    "myfoo"
  end
end

class B
  extend A

  def self.bar
    foo
  end
end

B.bar
#=> "myfoo"

ただし、インスタンスからメソッドを呼び出すことはできないことに注意してください。

b = B.new
b.bar
#=> NoMethodError: undefined method `bar' for #<B:0x007fefc4e19db0>

これは、 vsについてさらに議論された記事includeですextend

最後のメッセージは物事をうまくまとめています:

たとえば、includeメソッドを使用し、クラスメソッドにはextendを使用します。また、includeを使用してインスタンスメソッドとクラスメソッドの両方を追加しても問題ない場合があります。どちらも非常に便利で、大量のコードを再利用できます。また、深い継承を回避し、代わりにコードをモジュール化して必要な場所に含めることもできます。これは、はるかにルビーな方法です。

于 2012-11-30T02:11:25.530 に答える