我认为我的 Controller 中有一个非常简单的方法:
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 我的代码工作正常......
最佳答案
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
关于Ruby:类的未定义局部变量或方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35189308/