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>

是一篇include关于vs的更多讨论的文章extend

最后的消息总结得很好:

对实例方法使用include,对类方法使用extend。此外,有时可以使用 include 添加实例和类方法。两者都非常方便,并且允许大量代码重用。它们还允许您避免深度继承,而只是模块化代码并在需要的地方包含它,这更像是 ruby​​ 方式。

于 2012-11-30T02:11:25.530 回答