在 rails 中将主题标签转换为适当的链接

Turning hashtags to links in place, in rails

我正在尝试将主题标签转换为微型post 中的链接。我已经实现了一个名为 simple_hashtag 的 gem,它似乎适用于此的链接方面。然而,gem 的工作原理是从 post 中提取主题标签并将它们显示在自己的循环中。因此,例如,如果我的 Micropost 是:

    Today I went #snowboarding, it was #awesome

提取标签的代码是作为循环完成的,这意味着它必须在内容之外完成。

    <p><%= micropost.content %></p>
    <ul>
        <% micropost.hashtags.each do |hashtag| %>
            <li><%= link_to hashtag.name, hashtag_path(hashtag.name) %></li>
        <% end %>
    </ul>

完成后的视图如下所示:

    Today I went #snowboarding, it was #awesome
    - snowboarding
    - awesome

是否可以让代码扫描内容并用适当的链接替换主题标签?我想知道是否有办法收集主题标签,将它们转换为链接,然后在内容中替换它们?

我知道我可以使用以下方法扫描内容并找到哈希值:

    <% content = micropost.content %>
    <% hashes = content.scan(/#\w+/) %>
    <% hashes.each do |hash| %>
        <%= hash %>
    <% end %>

然后我想使用 hash.gsub! 甚至 Javascript 之类的东西,用链接替换内容中的主题标签,而不是将它们列在下面。

您可以为此使用帮助程序,例如:

<%= render_with_hashtags(micropost.content) %>

在您看来,代码如下:

class MicropostHelper
  def render_with_hashtags(content)
    content_words = content.split(" ")
    content_with_links = content_words.map do |word| 
      if word.contains?("#")
        link_to hashtag.name, hashtag_path(hashtag.name)
      else
        word
      end
    end

    content_with_links.join(" ")
  end
end

因此,我们对内容中的每个单词进行迭代,在剩下的部分用链接替换主题标签 "as is"。

我会使用正则表达式,而不是拆分和连接文本

def render_with_hashtags(text)
  text.gsub(/(?:#(\w+))/) {hashtag_link()}
end
def hashtag_link(hash)
  link_to "##{hash}", hashtag_path(hash)
end

如果需要,您可以在方法中添加 html_safe