2012-12-01 127 views
0

運行我下面的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 
+0

你可以發佈s3parse.rb或至少使用AccountLog類的相關部分嗎? – jboursiquot

+0

嗨,這是整個類和文件,我只是從命令行運行該文件,我的目標是將正則表達式重構爲單獨的方法,以使其更好地讀取 – BC00

+0

您正在嘗試使用s3log變量?如果這是一個ruby腳本,你應該將該邏輯移出課程之外。 –

回答

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) 

請注意,使用第二種方法,你不需要修改方法定義,只需通過account_log實例調用extract_account_id即可。

我想你會想s3log = File...以外的類定義。

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

然後你就可以訪問它AccountLog::S3log

+0

謝謝大家。我將其更改爲account_log.extract_account_id(行),它正常工作。由於帳戶ID的提取應該在實例(個人s3log)上,我認爲使用實例方法而不是類方法是有意義的。 – BC00

+0

@ BC00我可能是錯的,但是您從文件行中提取ID以將其存儲在實例中。這聽起來更像是類方法的工作而不是實例方法。即使你沒有一個AccountLog的實例,你仍然應該能夠從一行文本中提取ID號? –

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 
0

雖然你可以採取類方法的方法,似乎有更多的事情發生。

你應該把提取邏輯放在一個方法本身,而不是讓它在你的班級聚集。然後在課程外部,有一個AccountLog實例,您可以在其中調用日誌和帳戶ID提取方法。那時你可以用這些值做點什麼。

類或不是類的方法是一個細節,我們可以探討之後,我覺得類更清潔一點。