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

时间:2015-10-20 16:59:06

标签: css ruby-on-rails regex ruby-on-rails-4 hashtag

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

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

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

目前,URL,#hashtgs和@mentions的格式与文本的其余部分类似。

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

我找到twitter-text gem,它似乎提供了这样的功能,但我的问题是我不需要 - 并且不希望 - 将这些网址,#hashtags和@mentions变成真正的链接。< / p>

实际上,如this Stack Overflow question中所述,twitter-text gem默认使用Twitter::Autolink转换网址,#hashtags和@mentions。

这不是我想要的:我只是想更新我的网址样式,#hashtags和@mentions。

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

- - - -

更新

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

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

然后,我定义了以下CSS类:

.highlight {
    color: #337ab7;
}

最后,我在所需视图中实施了<%= highlight(post.copy) %>

我现在收到以下错误:

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

我做错了什么?

- - - -

1 个答案:

答案 0 :(得分:3)

我确定可以改进以下每种正则表达式模式以匹配更多选项,但是,以下代码适用于我:

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

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

def highlight_mention(str)
    str.gsub!(/\B(\@[a-z0-9_-]+)/i, '[\1]')
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的方法。尝试将方法的名称从突出显示更改为new_highlight以查看是否可以解决新问题。