Ruby: undefined local variable or method for Class
我假设在我的控制器中有一个非常简单的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
这给了我一个错误:
1 | undefined local variable or method `request_all_listings' for ReportsController:Class |
我在这里做错什么了?当我删除
要修复它,您需要将
1 2 3 | def self.request_all_listings ... end |
或者创建一个对象来调用
1 | ReportsController.new.request_all_listings |
一般来说,在加载类时进行工作是不好的形式。这使得在没有完成工作的情况下加载类是不可能的,并且会减慢速度,使其难以使用和测试。
相反,我建议在加载实例并将其缓存在类实例变量中时执行此操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 2 3 | def initialize request_all_listings end |
创建报表控制器实例时,
1 | reports = ReportsController.new |