红宝石,没有方法错误

时间:2012-12-01 17:15:19

标签: ruby

运行我的以下ruby脚本时收到以下错误:

s3parse.rb:12:in `block in <class:AccountLog>': undefined method `extract_account_id' for AccountLog:Class (NoMethodError)

我不认为它应该是一种类方法,是不是有理由不考虑我的方法?

class AccountLog
attr_accessor :bytes, :account_id, :date

    def extract_account_id(line)
            line.match(%r{accounts/(\d+)}).captures.join.to_i
    end

    s3log = File.open('vidcoder.txt').each do |line|
        account_log = AccountLog.new
        account_log.date = line.match(%r{\[[^:]*}).to_s.delete"[" #need to finish this regex to make it work
        account_log.account_id = extract_account_id(line)
        account_log.bytes = line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures.join.to_i
        puts "\n" 
        puts "The api request on #{account_log.date} was fromm account number #{account_log.account_id} and the bytes were #{account_log.bytes}"
    end

end

3 个答案:

答案 0 :(得分:3)

def extract_account_id将定义一个实例方法。

在你调用它的方式中,你需要一个类方法。

像这样定义:

def self.extract_account_id(line)

或者,因为您已经拥有AccountLog个实例,请使用它来调用extract_account_id

account_log.account_id = account_log.extract_account_id(line)

请注意,使用第二种方式您无需更改方法定义,只需通过extract_account_id实例调用account_log

我猜你想把s3log = File...放在课堂定义之外。

或者使用常量:S3log = ...

然后您可以AccountLog::S3log

访问它

答案 1 :(得分:0)

有什么理由你认为它不应该是一种类方法吗?您正在类方法的上下文中使用它,这就是为什么它说类AccountLog没有这样的方法。

如果您将方法命名为self.extract_account_id(line),我相信它会起作用。

从你想要做的事情来看,我认为这就是你要找的东西?

class AccountLog
  attr_accessor :bytes, :account_id, :date

  def self.extract_account_id(line)
    line.match(%r{accounts/(\d+)}).captures.join.to_i
  end
end

s3log = File.open('vidcoder.txt').each do |line|
  account_log = AccountLog.new
  account_log.date = line.match(%r{\[[^:]*}).to_s.delete"[" #need to finish this regex to make it work
  account_log.account_id = extract_account_id(line)
  account_log.bytes = line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures.join.to_i
  puts "\n" 
  puts "The api request on #{account_log.date} was fromm account number #{account_log.account_id} and the bytes were #{account_log.bytes}"
end

答案 2 :(得分:0)

虽然您可以采用类方法方法,但似乎还有一些进展。

您应该将提取逻辑放在一个方法中,而不是让它在您的类中挂起。然后在类之外,有一个AccountLog实例,您可以在其中调用日志和帐户ID提取方法。那时你可以用这些值做点什么。

类方法与否是我认为在课程更干净之后我们可以探索的细节。