Rails 4:如何识别和格式化模型属性中的链接、主题标签和提及项?

Rails 4: how to identify and format links, hashtags and mentions in model attributes?

在我的 Rails 4 应用程序中,我有一个 Post 模型,其中 :copy:short_copy 作为自定义属性(字符串)。

这些属性包含社交媒体(Facebook、Twitter、Instagram、Pinterest 等)的副本。

我在 Posts#Show 视图中显示这些属性的内容。

目前,URL、#hashtags 和@mentions 的格式与文本的其余部分一样。

我想做的是以不同的方式格式化它们,例如另一种颜色或粗体。

我找到了 twitter-text gem,它似乎提供了这样的功能,但我的问题是我不需要——也不希望——将这些 URL、#hashtags 和@mentions 变成真正的链接.

确实,twitter 文本 gem 似乎默认使用 Twitter::Autolink 转换 URL、#hashtags 和 @mentions,如 this Stack Overflow question 中所述。

这不是我想要的:我只想更新我的 URL、#hashtags 和@mentions 的样式。

如何在 Ruby / Rails 中执行此操作?

——————

更新:

根据 Wes Foster 的回答,我在 post.rb 中实现了以下方法:

def highlight(string)
  string.gsub!(/\S*#(\[[^\]]+\]|\S+)/, '<span class="highlight"></span>')
end

然后,我定义如下CSS class:

.highlight {
    color: #337ab7;
}

最后,我在想要的视图中实现了<%= highlight(post.copy) %>

我现在收到以下错误:

ArgumentError
wrong number of arguments (1 for 2..3)
<td><%= highlight(post.copy) %></td>

我做错了什么?

——————

我确信可以改进以下每个正则表达式模式以匹配更多选项,但是,以下代码对我有用:

def highlight_url(str)
    str.gsub!(/(https?:\/\/[\S]+)/, '[]')
end

def highlight_hashtag(str)
    str.gsub!(/\S*#(\[[^\]]+\]|\S+)/, '[#]')
end

def highlight_mention(str)
    str.gsub!(/\B(\@[a-z0-9_-]+)/i, '[]')
end

# Initial string
str = "Myself and @doggirl bought a new car: http://carpictures.com #nomoremoney"

# Pass through each
highlight_mention(str)
highlight_hashtag(str)
highlight_url(str)

puts str   # > Myself and [@doggirl] bought a new car: [http://carpictures.com] [#nomoremoney]

在此示例中,我用方括号 [] 将匹配项括起来。您应该使用 span 标签并设置样式。此外,为了简单起见,您可以将所有三个 gsub! 包装到一个方法中。

针对提问者的附加错误问题进行了更新

看起来错误是引用了另一个名为 highlight 的方法。尝试将方法的名称从 highlight 更改为 new_highlight,看看是否能解决新问题。