2013-12-12 33 views
0

我有下面的代碼在我的應用程序控制器rails從控制器方法獲取輸出?

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

    def get_mkts(all_idx) 
    mkts = Set.new 
    all_idx.each do |idx| 
     m = decode_index_names(idx) 
     puts m[:mkt] 
     mkts.add(m[:mkt]) 
    end 
    end 


    def decode_index_names(name) 
     mkt = name.split(/[0-9]/)[0] 
     type = get_first_num(mkt); 
     {:mkt => mkt,:type => type} 
    end 

    def get_first_num(str) 
    str[/\d+/] 
    end 
end 

而且我輸入字符串像這樣的數組:

["USEQUITIES2tv10", "USEQUITIES2tv15", "USEQUITIES2tv20", "NONUSEQUITIES2tv5", "NONUSEQUITIES2tv10", "NONUSEQUITIES2tv15", "NONUSEQUITIES2tv20", "BONDS2tv5", "BONDS2tv10", "BONDS2tv15", "BONDS2tv20" 
, "ES1", "ES2tv5", "ES2tv10", "ES2tv15", "ES2tv20", "NQ1", "NQ2tv5", "NQ2tv10", "NQ2tv15", "USBONDS2tv5", "USBONDS2tv10", "USBONDS2tv15", "USBONDS2tv20", "GERMANBONDS2tv5", "GERMANBONDS2tv10", "GERMANB 
ONDS2tv15", "GERMANBONDS2tv20", "EQUITIESnBONDS2tv5", "EQUITIESnBONDS2tv10", "EQUITIESnBONDS2tv15", "EQUITIESnBONDS2tv20", "COMMODITIES2tv5", "COMMODITIES2tv10", "COMMODITIES2tv15", "COMMODITIES2tv20", 
"CURRENCIES2tv5"] 

方法get_mkts通過應該循環,提取文本向上總計第一個數字並創建一個唯一的符號數組(這就是爲什麼我使用Set)。但是,我無法獲得輸出原始輸入以外的任何內容的方法。在rails控制檯中,我可以從「puts m [:mkt]」的輸出中看到每個循環都獲得了正確的值,我只是不知道如何返回set mkts而不是輸入值。有任何想法嗎?

回答

2

如果您不使用return,則Ruby方法會返回最後一條語句的結果。在你的情況下,它是each,這就是爲什麼你回到輸入。你可以做這樣的事情:

def get_mkts(all_idx) 
    mkts = Set.new 
    all_idx.each do |idx| 
    m = decode_index_names(idx) 
    puts m[:mkt] 
    mkts.add(m[:mkt]) 
    end 
    mkts 
end 

這將返回mkts集而不是all_idx

+0

啊確定這是這麼簡單..什麼一個小時的浪費笑感謝 – jhlu87

0

可以改寫的方法有:

def get_mkts(all_idx) 
    all_idx.map { |idx| decode_index_names(idx) }.uniq 
end 

看起來更加rubyish和更短的和更清潔的

+0

這不實際上非常有用,因爲decode_index_names的輸出是一個兩項哈希,我希望輸出只是該哈希的第一項的分組 – jhlu87

相關問題