2012-08-30 39 views
1

解決方案將splat和hash傳遞給方法?

當在1.8,我不能直接使用公認的答案,但它幫我找到如下:

def stylesheet_include(*sources) 
    if /^3\.[1-2]/ =~ Rails.version && sources.last.is_a?(Hash) 
    sources.last.delete :cache 
    end 
    stylesheet_link_tag *sources 
end 

原來的問題

上修改stylesheet_link_tag輔助工作根據rails版本正確傳遞內容,因爲這個地圖可能會作爲Rails 3.1.x中的引擎加載。這裏是我的代碼,到目前爲止,我想要做什麼:

def stylesheet_include(*sources) 
    options = sources.extract_options!.stringify_keys 
    if /^3\.[1-2]/ =~ Rails.version 
    options.delete "cache" 
    end 
    stylesheet_link_tag *sources, options 
end 

的問題是,我無法通過第二個參數,當我打電話*可變來源。我不能僅僅通過sources, options,因爲link_tag方法需要幾個參數,而不是數組。如果它收到一個數組,那麼你會得到諸如路徑:css/reset/css/main.css

任何人有我如何能得到這個工作的想法。更糟糕的情況下,我可以不通過選項,但我寧願避免這種情況。

回答

1

其實,如果你正在使用Ruby 1.9的,你確實可以收到其他參數提示圖標。像這樣:

def stylesheet_include(*sources, options) 
    options = sources.extract_options!.stringify_keys 
    if /^3\.[1-2]/ =~ Rails.version 
    options.delete "cache" 
    end 
    stylesheet_link_tag *sources, options 
end 

的問題,當然,是你傳遞給該方法的最後一件事,然後將永遠成爲options,即使它不是一個哈希值。而且您也不能將默認值分配給options,因爲該行爲會相當模糊。因此,如果您始終確保至少傳遞一個空散列作爲stylesheet_include的最後一個參數,那麼該解決方案將起作用。

如果不爲你工作,嘗試服用圖示作爲參數,看是否在圖示的最後一個成員是一個哈希:如果是的話這是你的選擇,如果不是你的選擇是空的。

+0

不幸的是,我們運行稀土元素1.8.7,所以這是一個不行:( – agmcleod

+0

不幸的是,我認爲我最後拋棄的解決方案是最好的選擇 - 檢查splat數組的最後一個成員是哈希,如果是,假設它的選項哈希值。 – Veraticus

+0

嗯,你給我的主意,試圖剛剛修改源數組中的哈希值,而不是修改它。瞧!(我把我的解決方案在我的答案,讓我可以接受你的)。 – agmcleod