我认为在我的控制器中我是一个非常简单的方法:
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时,我的代码工作正常......
答案 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