在我的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>
我做错了什么?
- - - -
答案 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
以查看是否可以解决新问题。