我在控制器中有一个非常简单的方法:
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我的代码工作正常...
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)
| 归档时间: |
|
| 查看次数: |
4508 次 |
| 最近记录: |