Как пометить пользователей в фиде, как это делают Facebook или Twitter?
Я работаю над приложением рельсов. Я хочу реализовать пользовательские теги, как в Facebook или Twitter. Когда пользователь пишет в ленте, он может пометить любого пользователя символом @ при запуске.
Я использую плагин автозаполнения пользовательского интерфейса Jquery.
У меня есть эта ссылка Реализация автозаполнения пользовательского интерфейса jquery, чтобы показать предложения при вводе "@", которые помогли мне реализовать автозаполнение части.
Но теперь я хочу связать это автоматически завершенное имя пользователя с URL профиля пользователя, например, Username = Mak, тогда ссылка должна быть сгенерирована следующим образом:
<a href="http://www.example.com/username">Username</a>
Так что, пожалуйста, объясните мне, как я могу реализовать это в моем приложении rails?
2 ответа
Эй, это не требует вышеуказанных методов. Я сделал это с помощью простого регулярного выражения.
<% @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
Я надеюсь, что это поможет другим.
Если вы хотите сделать это, вы должны написать специальные методы set /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
Затем вы должны использовать эти методы установки / получения в частичном. Я только что написал это "из моей головы", там может быть какая-то синтаксическая чушь, но я думаю, что вы понимаете, о чем я говорю!
Преимущество этого метода заключается в том, что вы также можете изменять имена пользователей, поскольку вы сохраняете идентификатор пользователя в момент создания постов.