将hash标签转换为rails中的链接

abb*_*567 2 javascript ruby replace ruby-on-rails hashtag

我试图将主题标签转换为微博中的链接.我已经实现了一个名为simple_hashtag的gem,它似乎适用于链接方面.但是,gem通过从帖子中提取主题标签并在自己的循环中显示它们来工作.所以,例如,如果我的Micropost是:

    Today I went #snowboarding, it was #awesome
Run Code Online (Sandbox Code Playgroud)

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

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

这使完成的视图看起来像:

    Today I went #snowboarding, it was #awesome
    - snowboarding
    - awesome
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Moh*_*ady 8

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

def render_with_hashtags(text)
  text.gsub(/(?:#(\w+))/) {hashtag_link($1)}
end
def hashtag_link(hash)
  link_to "##{hash}", hashtag_path(hash)
end
Run Code Online (Sandbox Code Playgroud)

如果需要,可以html_safe在方法内添加.


Mar*_*tin 5

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

<%= render_with_hashtags(micropost.content) %>
Run Code Online (Sandbox Code Playgroud)

在您看来,代码如下:

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
Run Code Online (Sandbox Code Playgroud)

因此,我们对内容中的每个单词进行迭代,用链接替换主题标签,其余部分保持“原样”。