新手问题 如何实现论坛中 @ 用户的功能

pengedy · 2014年04月27日 · 最后由 alsotang 回复于 2014年04月28日 · 5198 次阅读

如题,本人新手,最近在做东西的时候需要实现论坛回帖中@用户的功能,也就是用户 A 在某评论中@用户 B,用户 B 能收到提示。

实现这种功能有特定的套路么,还是需要用到什么 gem?

套路:

  1. 用正则把正文的 @username 字符串提取出 username
  2. 查询提及的 username 对应的用户
  3. 为每个用户添加一条通知或记录

#1 楼 @Rei 多谢,我先试着做一下。

#1 楼 @Rei 原来是这样做的啊。。。学习。。。

#1 楼 @Rei

谢谢回答,因为我最近也准备做@功能。

但是,如果是做成“只要出现@username就一定匹配得到”其实是很难的,因为不知道@后面接多少个字符所组成的字符串是 username,所以首先想到的方法就是要求@username后面一定要接至少一个空白字符。例如 ruby-china 就是如此。

(我未尝试如果去掉空白字符是否能成功艾特,如有错误请见谅)

这样就要求用户必须知道这一点,因为如果用户忘记加入空白就无法艾特了。例如 ruby-china 是在前端输入@符号有自动提醒和补全功能,如果用户按下回车则自动不上空格。

那么是否意味着这种艾特方式要求前端也有配套措施,否则无法保证用户一定理解了艾特用户名后一定要加空格这个道理?

6 楼 已删除

用正则提出,然后用 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

#4 楼 @mosky 用户名限制了英文、数字还有杠,就没有空格问题了。

https://github.com/ichord/At.js 这个 JS 插件你也有可能会用到

需要 登录 后方可回复, 如果你还没有账号请 注册新账号