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

时间:2016-02-03 22:50:22

标签: 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

这给了我错误:

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

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

2 个答案:

答案 0 :(得分:6)

request_all_listings含糊不清。它可以是变量,也可以是 类方法调用 request_all_listings是一种对象方法。

要解决此问题,您需要将request_all_listings定义为类方法。

def self.request_all_listings
    ...
end

或创建一个对象,使用。

调用request_all_listings
ReportsController.new.request_all_listings

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

相反,我建议在加载实例并在class instance variable中缓存它时执行此工作。

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

答案 1 :(得分:0)

将行request_all_listings移动到构造函数中:

def initialize
    request_all_listings
end

创建ReportsController实例时,initialize将自动运行:

reports = ReportsController.new