好的我正在创建一个宝石,可以在用户的帖子中找到标签#
,@
或$
。我正在使用一个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
答案 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