如何修复使用 link(例如“@test @test2”)但 @test2 links 到 @test 页面的渲染提及

How do I fix rendering mentions with link (e.g. "@test @test2") but @test2 links to @test's page

我制作了一个处理推文正文的辅助方法,这样如果有任何提及,就会添加 link。它确实做到了,但是当提到的用户名与较长用户名的一部分(例如@test @test2)匹配时,只有@test 将被 linked.

结果 html 如下所示: @test @test2

我怎样才能让它看起来像这样: @test @test2

这是我的辅助方法:

    def render_body(twit)
     return twit.body unless twit.mentions.any?
     processed_body = twit.body.to_s
     twit.mentions.each do |mention|
       processed_body = processed_body.gsub("@#{mention.user.username}", "<a href='/user/#{mention.user.id}'>@#{mention.user.username}</a>")
     end
     return processed_body.html_safe
    end

我检查了数据库,它确实记录了 @test2 的提及,只是无法呈现它。

简单的字符串替换在这里不起作用,您必须使用锚定的正则表达式。这意味着您永远不会匹配单词的一部分,只会匹配整个单词:

processed_body = processed_body.gsub(/\b@#{mention.user.username}\b/, 
                                     "<a href='/user/#{mention.user.id}'>@#{mention.user.username}</a>")

这里我们用正则表达式替换了模式字符串,并使用 \b 将其锚定到单词边界。