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
,看看是否能解决新问题。
在我的 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
,看看是否能解决新问题。