`Case / when`语句在某些时候有效

时间:2014-03-05 14:06:09

标签: ruby-on-rails ruby

好的我正在创建一个宝石,可以在用户的​​帖子中找到标签#@$。我正在使用一个case语句,它似乎有效,但有时候。例如,我将使用@you这样的字符串,但是#cool不起作用,除非我添加#cool @you。似乎其他when语句仅在第一个when语句为真时才有效。 REGEX就是它知道要寻找什么,我知道那些确实有用。

  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

1 个答案:

答案 0 :(得分:3)

出于某种原因,你迭代REGEXS,忽略迭代中的项目,然后再次对它们进行硬编码......实际上你会text.gsub(Supertag::Tag::USERTAG_REGEX) ... 3次 - 列表中的每个REGEX一次。

另外,您滥用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