【问题标题】:Rails 4: how to identify and format links, hashtags and mentions in model attributes?Rails 4:如何识别和格式化模型属性中的链接、主题标签和提及?
【发布时间】:2016-01-19 11:00:19
【问题描述】:

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

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

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

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

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

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

事实上,twitter-text 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">\1</span>')
end

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

.highlight {
    color: #337ab7;
}

最后,我在所需的视图中实现了&lt;%= highlight(post.copy) %&gt;

我现在收到以下错误:

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

我做错了什么?

————

【问题讨论】:

  • 使用正则表达式并将它们包装在&lt;span class="hashtag"&gt;中。

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


【解决方案1】:

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

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 的方法。尝试将方法的名称从 highlight 更改为 new_highlight,看看是否能解决新问题。

【讨论】:

  • 太棒了,非常感谢!我正在尝试按照您的建议使用跨度,但这会导致一些语法错误。这就是我尝试做的事情,例如在第一种方法中:def highlight(string) string..gsub!(/(https?:\/\/[\S]+)/, '&lt;span class="highlight"&gt;\1&lt;/span&gt;') end 知道我怎样才能做到这一点吗?
  • @ThibaudClement 您的代码中有 2 个点:string..gsub
  • 抱歉,打错了。我相信问题来自我使用的'"。你不觉得吗?
  • 确切的错误是什么?我不认为它会是引号。也许更新你的问题的结尾,这样我就可以看到你的确切代码和错误
  • 你是对的,没有与报价相关的问题。但是,我现在收到一个新错误,正如您在我的 UPDATE 中看到的那样。
猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 2017-04-12
  • 2018-08-24
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2012-12-23
  • 2021-03-03
相关资源
最近更新 更多