如何像 Facebook 或 Twitter 一样在 feed 中标记用户?

发布于 2024-12-11 17:15:02 字数 605 浏览 2 评论 0原文

您好,我正在开发 Rails 应用程序。我想像 facebook 或 twitter 那样实现用户标记。当用户在提要中发帖时,他可以在开始时用 @ 字符标记任何用户。

我正在使用 Jquery UI 自动完成插件

我有这个参考 实现 jquery UI 自动完成以在您键入“@”时显示建议“ 这帮助我实现了自动完成部分。

但现在我想将自动完成的用户名链接到用户配置文件 url,例如 Username = Mak,然后应该生成链接,如下所示

<a href="http://www.example.com/username">Username</a>

所以请指导我如何在我的 Rails 应用程序中实现此功能?是否有任何 gem 可以这样做。

HI I am working on a rails application. I want to implement user tagging as facebook or twitter does. When user is posting in feed he can tag any user with @ character at starting.

I am using Jquery UI Autocomplete plugin.

I have this reference
Implementing jquery UI autocomplete to show suggestions when you type "@" which helped me to implement auto complete part.

But now I want to link that auto completed username to users profile url e.g Username = Mak then link should be generated like

<a href="http://www.example.com/username">Username</a>

So please guide me how can I implement this in my rails application?Is there any gem to do so.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

长不大的小祸害 2024-12-18 17:15:02

如果您想这样做,您应该为帖子内容编写特定的 setter/getter 方法。一个简单的示例:

在模型中(在本例中,包含帖子的列称为“内容”):

attr_reader :set_content
attr_accessor :set_content
attr_reader :get_content
attr_accessor :get_content
def set_content=(content)   

     users = content.scan(/\@(.*)\ /)
     users.each do |user_name|
          user = User.find_by_name(user_name[1])
          content.gsub!("@#{user_name[1]}", "|UID:#{user.id}|") unless user.nil?
     end
     self.content=content
end

def get_content
     current_content=self.content
     users = self.content.scan(/\|UID\:([0-9]*)\|/)
     users.each do |user_id|
          user = User.find(user_id[1])
          current_content.gsub!("|UID:#{user_id[1]}|", "<your link stuff here>")
     end
     current_content
end

那么您应该在部分中使用这些 setter/getter 方法。我只是“凭空想象”写了这篇文章,里面可能有一些语法上的废话,但我想你明白我在说什么!

此方法的优点是您还可以更改用户名,因为您在创建帖子时存储了用户的 ID。

If you want to do that you should write specific setter/getter methods for the post content. A simple example:

In model (in this example the column with the post is called "content"):

attr_reader :set_content
attr_accessor :set_content
attr_reader :get_content
attr_accessor :get_content
def set_content=(content)   

     users = content.scan(/\@(.*)\ /)
     users.each do |user_name|
          user = User.find_by_name(user_name[1])
          content.gsub!("@#{user_name[1]}", "|UID:#{user.id}|") unless user.nil?
     end
     self.content=content
end

def get_content
     current_content=self.content
     users = self.content.scan(/\|UID\:([0-9]*)\|/)
     users.each do |user_id|
          user = User.find(user_id[1])
          current_content.gsub!("|UID:#{user_id[1]}|", "<your link stuff here>")
     end
     current_content
end

Then you should use these setter/getter methods in the partial. I just wrote this "out of my head" there might be some syntactical crap in it but I think you uznderstoud what Im talking about!

THe advantage of this method is that you can also change the users names beacause you store the id of the user at the moment of posts creation.

-残月青衣踏尘吟 2024-12-18 17:15:02

嘿,不需要上述方法。我使用简单的正则表达式做到了。

<% @str = @madyrocks solved problem of @username tagging %>

<%=@result_string = @str.gsub(/(\^|\s|\B)@(([a-zA-Z])(_?[a-zA-Z0-9]+)*|_([a-zA-Z0-9]+_?)*)/i, 
%Q{ <a href="http://example.com/\\2">\@\\2</a>}) %>

在我的正则表达式中,我使用了 (\^|\s|\B) 因为 @ 可以出现在字符串开头或标记用户时的空格之后。

([a-zA-Z])(_?[a-zA-Z0-9]+)*|_([a-zA-Z0-9]+_?)* 这是用于验证用户名。在我的应用程序中,用户名必须以字母开头,后跟字母和字母。数字。

没有。 2 用于在正则表达式中进行第二场比赛。

有关更多详细信息,请尝试 Rubular.com 上的正则表达式,

我希望这对其他人有帮助。

Hey it doesn't required above methods. I did it using simple regex.

<% @str = @madyrocks solved problem of @username tagging %>

<%=@result_string = @str.gsub(/(\^|\s|\B)@(([a-zA-Z])(_?[a-zA-Z0-9]+)*|_([a-zA-Z0-9]+_?)*)/i, 
%Q{ <a href="http://example.com/\\2">\@\\2</a>}) %>

In my regex I have used (\^|\s|\B) because @ can occur at start of string or after a white space while tagging a user.

([a-zA-Z])(_?[a-zA-Z0-9]+)*|_([a-zA-Z0-9]+_?)* This is used to validate username. In my application username must start with alphabet followed by alphabets & numbers.

The no. 2 used to take second match in regex.

For more details try the regex on Rubular.com

I hope this will help others.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文