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

标签 ruby

我认为我的 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/

相关文章:

ruby-on-rails - 如何在不使用表单助手的情况下使用 Rails Paperclip 上传图像

ruby - Paperclip:以编程方式分配图像并设置其名称

ruby-on-rails - 在 Rails View 中构建自定义路径

ruby-on-rails - Rails 路线 : GET without param :id

Ruby 1.9 unicode 在 Regexp 中转义

ruby - 惯用的 Ruby - 仅在不使用 `if` 的情况下分配变量

ruby - 是否可以使用 Ruby LDAP 更改 AD 用户帐户?

ruby-on-rails - Rails 5 - Rolify - 试图从用户中删除角色实例

ruby-on-rails - 如何在 rails 中按行计数?

ruby-on-rails - 如何在 Rails 中的模型上有两个 'access levels'?