2014-03-05 47 views
-3

好的,我正在創建一個應該在用戶帖子中查找標籤#@$的寶石。我在聲明中使用了一個案例,它似乎有效,只是有時候。例如,我將有一個像@you這樣的字符串,並且可以工作,但是#cool不起作用,除非我添加#cool @you。看來其他的when聲明僅在第一個when聲明爲真時才起作用。 REGEX就是這樣,它知道要尋找什麼,我知道那些工作。`Case/when`語句在某些時候有效

REGEXS = [Supertag::Tag::USERTAG_REGEX, Supertag::Tag::HASHTAG_REGEX, Supertag::Tag::MONEYTAG_REGEX] 

    def linkify_tags(taggable_content) 
    text = taggable_content.to_s 

    REGEXS.each do 
     case text 
     when text = text.gsub(Supertag::Tag::USERTAG_REGEX) {link_to($&, usertag_path($2), class: 'tag')} 
     when text = text.gsub(Supertag::Tag::HASHTAG_REGEX) {link_to($&, hashtag_path($2), class: 'tag')} 
     when text = text.gsub(Supertag::Tag::MONEYTAG_REGEX) {link_to($&, moneytag_path($2), class: 'tag')} 
     end 
    end  

    text.html_safe 
    end 
+0

老實說,不知道爲什麼這是越來越downvoted ... – Eugene

+0

我不明白爲什麼它要麼。本網站的重點不在於幫助人們嗎? –

回答

3

出於某種原因,你遍歷REGEXS,再次忽略了項目的迭代,然後將它們硬編碼...你居然做text.gsub(Supertag::Tag::USERTAG_REGEX) ... 3次 - 一次在你的列表中的每個正則表達式。

而且,你濫用case when結構,我建議你閱讀more about it

您應該刪除each完全,並且只使用明確的常數,或者重構你的代碼工作動態,也許是這樣的:

REGEXS = [[Supertag::Tag::USERTAG_REGEX, :usertag_path], 
      [Supertag::Tag::HASHTAG_REGEX, :hashtag_path], 
      [Supertag::Tag::MONEYTAG_REGEX, :moneytag_path]] 

    def linkify_tags(taggable_content) 
    text = taggable_content.to_s 

    REGEXS.each do |regex, path| 
     text = text.gsub(regex) {link_to($&, send(path, $2), class: 'tag')} 
    end  

    text.html_safe 
    end 
+0

完美運作。我真的需要關注我是如何理解這些和'if/elsif'語句的 –