如题,本人新手,最近在做东西的时候需要实现论坛回帖中@用户的功能,也就是用户 A 在某评论中@用户 B,用户 B 能收到提示。
实现这种功能有特定的套路么,还是需要用到什么 gem?
谢谢回答,因为我最近也准备做@功能。
但是,如果是做成“只要出现@username就一定匹配得到”其实是很难的,因为不知道@后面接多少个字符所组成的字符串是 username,所以首先想到的方法就是要求@username后面一定要接至少一个空白字符。例如 ruby-china 就是如此。
(我未尝试如果去掉空白字符是否能成功艾特,如有错误请见谅)
这样就要求用户必须知道这一点,因为如果用户忘记加入空白就无法艾特了。例如 ruby-china 是在前端输入@符号有自动提醒和补全功能,如果用户按下回车则自动不上空格。
那么是否意味着这种艾特方式要求前端也有配套措施,否则无法保证用户一定理解了艾特用户名后一定要加空格这个道理?
用正则提出,然后用 markdown 转成 html,这个是我的做法。也可以直接转成 html。 代码地址: 从内容处提出 user 生成一个 notifications
def convert_content
if self.content.include?("@")
users = find_user_in_content
users.each do |user|
url = "[@#{user.name}](/users/#{user.id})"
self.content.gsub!(/(@#{user.name})/, url)
end
end
self.content = markdown(self.content)
true
end
def format_user_in_content
self.content.scan(/@([\w\u4e00-\u9fa5]{2,20})/).flatten
end
def find_user_in_content
User.where(name: format_user_in_content)
end
def markdown(text)
markdown_render = Redcarpet::Render::HTML.new(hard_wrap: true, no_styles: true)
markdown = Redcarpet::Markdown.new(markdown_render, autolink: true, no_intro_emphasis: true)
markdown.render(text).html_safe
end