Ruby:未定义的局部变量或Class的方法

Ruby: undefined local variable or method for Class

我假设在我的控制器中有一个非常简单的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ReportsController < ApplicationController

  client = MWS.reports

  def request_all_listings
    begin
      parser = client.request_report('_GET_FLAT_FILE_OPEN_LISTINGS_DATA_', opts = {})
      @result = parser.parse["ReportRequestInfo"]["ReportProcessingStatus"]

      puts @result

    rescue Excon::Errors::ServiceUnavailable => e
      logger.warn e.response.message
      retry
    end
  end

  request_all_listings

end

这给了我一个错误:

1
 undefined local variable or method `request_all_listings' for ReportsController:Class

我在这里做错什么了?当我删除def request_all_listingsdef和end行,只需要让begin/rescue/end代码正常工作…


request_all_listings不明确。它要么是变量,要么是类方法调用。request_all_listings是一种对象方法。

要修复它,您需要将request_all_listings定义为类方法。

1
2
3
def self.request_all_listings
    ...
end

或者创建一个对象来调用request_all_listings

1
ReportsController.new.request_all_listings

一般来说,在加载类时进行工作是不好的形式。这使得在没有完成工作的情况下加载类是不可能的,并且会减慢速度,使其难以使用和测试。

相反,我建议在加载实例并将其缓存在类实例变量中时执行此操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Foo
  # class instance variable
  @all_listings = []

  # class method
  def self.request_all_listings
    puts"Calling request_all_listings"
    @all_listings = [1,2,3]

    return
  end

  # class method
  def self.all_listings
    request_all_listings if @all_listings.size == 0

    return @all_listings
  end

  # object method
  def all_listings
    return self.class.all_listings
  end
end

# request_all_listings is only called once for two objects
puts Foo.new.all_listings.inspect
puts Foo.new.all_listings.inspect


将行request_all_listings移到构造函数中:

1
2
3
def initialize
    request_all_listings
end

创建报表控制器实例时,initialize将自动运行:

1
reports = ReportsController.new