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

JVG*_*JVG 3 ruby

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

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
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

 undefined local variable or method `request_all_listings' for ReportsController:Class
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?当我删除def request_all_listingsdef和end行并且只有begin/rescue/end我的代码工作正常...

Sch*_*ern 6

request_all_listings很暧昧.它是变量或类方法调用. request_all_listings是一种对象方法.

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

def self.request_all_listings
    ...
end
Run Code Online (Sandbox Code Playgroud)

或者创建一个要调用的对象request_all_listings.

ReportsController.new.request_all_listings
Run Code Online (Sandbox Code Playgroud)

通常,在加载类时执行工作是不好的形式.这使得无法在没有工作的情况下加载类,并且可以减慢速度并使其难以使用和测试.

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

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
Run Code Online (Sandbox Code Playgroud)