Как создать систему тегов, как в Stack Overflow или Quora

Я хочу создать систему тегов, как показано здесь, на Stack Overflow или на Quora. Это будет отдельная модель, и я планирую использовать этот плагин автозаполнения, чтобы помочь пользователям найти теги. У меня есть пара вопросов:

  1. Я хочу, чтобы теги создавались полностью пользователями. Если пользователь вводит новый тег, набирая его и нажимая кнопку «Добавить», то этот тег добавляется в базу данных, но если пользователь вводит существующий тег, он использует его. Я думаю об использовании такого кода:

    def create
    
    @video.tags = find_or_create_by_name(@video.tags.name)
    
    end
    

    Я на правильном пути?

  2. Я хотел бы реализовать что-то вроде Stack Overflow или Quora, чтобы, когда вы щелкаете тег из предложенного списка или нажимаете кнопку «Добавить», этот тег добавлялся прямо над текстовым полем с помощью ajax. Как я могу реализовать что-то подобное?

Я знаю, что это открытый вопрос. На самом деле я ищу не столько точный код, сколько общий толчок в правильном направлении. Конечно, примеры кода не помешали бы :)

Примечание. Я НЕ прошу помощи в настройке плагина автозаполнения jQuery ... Я знаю, как это сделать. Скорее, мне кажется, что мне придется изменить код в плагине, чтобы вместо тегов, добавляемых внутри текстового поля, они добавлялись над текстовым полем. Буду признателен за любое направление с этим.


person Justin Meltzer    schedule 30.03.2011    source источник
comment
Я бы рекомендовал включить стемминг, чтобы, например, плавание и плавание отображались в тот же тег.   -  person mu is too short    schedule 31.03.2011
comment
ах да, отличный момент. Я разберусь с этим. Есть ли для этого хороший открытый исходный код? кроме того, есть ли другие предложения о том, как должен быть структурирован контроллер?   -  person Justin Meltzer    schedule 31.03.2011
comment
Я не делал никаких стеммингов в Ruby, но поиск в Google Ruby Stammer предлагает несколько вариантов. Вы также можете взглянуть на actions_as_taggable, если хотите увидеть, как работает существующее решение.   -  person mu is too short    schedule 31.03.2011
comment
да, я уже пробовал act_as_taggable раньше ... кажется, мне пришлось бы значительно его настроить ...   -  person Justin Meltzer    schedule 31.03.2011
comment
@mu кажется, что plays_as_taggable_on: github.com/mbleigh/acts-as-taggable-on позволяет пользователям вводить сразу несколько тегов, разделенных запятыми. Я хочу, чтобы пользователи могли добавлять только один тег за раз. Также я хочу, чтобы теги добавлялись через ajax над полем, а не обычным HTTP-запросом, а также отображали предложения тегов с помощью плагина автозаполнения. Я как бы не понимаю, использовать плагин или нет. Что вы думаете? Насколько сложно будет изменить плагин тегов в соответствии с моими потребностями?   -  person Justin Meltzer    schedule 31.03.2011
comment
Я не гуру, работающий с actions_as_taggable, поэтому я не знаю, насколько сложно было бы приспособить его к вашим потребностям, поэтому я просто комментирую, а не отвечаю.   -  person mu is too short    schedule 31.03.2011


Ответы (2)


gem mbleigh plays_as_taggable_on - это полнофункциональное решение, которое вам обязательно нужно изучить. ближе. Реализация надежна и гибка в использовании. Однако в основном он связан с прикреплением тегов к объектам, получением тегов на объектах и ​​поиском элементов с тегами. Это все, что касается внутреннего сервера.

Большая часть функций, которые вы хотите изменить (на основе ваших комментариев), на самом деле больше связана с вашей реализацией интерфейсного интерфейса, и гем на самом деле мало что делает для вас. Я отвечу на ваши запросы по очереди.

  1. Если пользователь вводит новый тег, этот тег добавляется, если пользователь вводит существующий тег, используется существующий тег. act_as_taggable_on делает это.
  2. Щелкните тег из предложенного списка, чтобы добавить этот тег. Это проблема реализации - на серверной стороне вам нужно будет собрать предлагаемый список тегов, а затем отобразить их в своей презентации как ссылки на вашу функцию обработки.
  3. Автозаполнение, когда пользователь вводит потенциальный тег. Вы будете использовать плагин автозаполнения jQuery для списка элементов, извлеченных из таблицы тегов. С помощью дополнительного jQuery вы можете фиксировать, когда они выбрали один из вариантов или завершили ввод своего нового тега, а затем вызвать функцию обработки.
  4. Ограничьте пользователей вводом только одного тега. Это будет ваша реализация пользовательского интерфейса - как только они ввели или выбрали тег, вы его обрабатываете. Если они вводят два слова, разделенных запятой, то до или во время обработки вы должны либо рассматривать их как один тег, либо брать только текст до первой запятой и отбрасывать остальные.
  5. Когда вы обрабатываете добавление тега, вам нужно будет сделать две вещи. Во-первых, вам нужно обработать изменения отображения пользовательского интерфейса, чтобы отразить, что тег был введен / выбран. Это включает в себя размещение тега в «выбранной» области, удаление его из «доступного» дисплея, обновление любых счетчиков и т. Д. Во-вторых, вам необходимо отправить запрос на сервер, чтобы фактически добавить тег к объекту и сохранить его. этот факт в базу данных (где драгоценный камень с тегами возьмет на себя управление за вас). Вы можете сделать это либо с помощью отдельного запроса AJAX для каждого тега, либо обработать его при отправке формы. В последнем случае вам понадобится переменная, чтобы сохранить текущий список тегов, которые были добавлены / удалены, и вам понадобится код для обработки добавления / удаления значений в эту переменную.

В качестве примера сохранения тегов при редактировании, но не отправки на сервер / db до сохранения формы, вы можете взглянуть на функцию тегов на странице нового сообщения Tumblr. Вы можете добавлять / удалять теги при создании сообщения, но ни один из них не попадает в базу данных, пока вы не нажмете «Сохранить».

Как видите, большая часть этого зависит от вас, чтобы определить и закодировать, но имеет очень мало общего с серверной частью. Самоцвет прекрасно позаботится об этом.

Надеюсь, это поможет вам двигаться в правильном направлении.

person Yardboy    schedule 08.06.2011
comment
Я пытаюсь понять, как сделать теги в стиле SO с помощью этого драгоценного камня здесь - github.com/mbleigh/acts-as-taggable-on/issues/ - person James L.; 05.08.2017

Чем больше я пытаюсь заставить plays-as-taggable-on гем, чтобы работать, тем больше я думаю, что это принципиально разные типы проблем . Конкретно из-за псевдонимов. Драгоценный камень считает каждую метку своей особой снежинкой, что затрудняет создание синонимов. В некоторых случаях этого недостаточно, если вы хотите, чтобы у тега было описание, вам нужно отредактировать данные миграции (что несложно сделать).

Вот что я подумываю о реализации, с учетом проблемы, которую я реализовал через драгоценный камень. Предположим, вы хотите создать систему тегов для технологий.

Рассмотрим следующий псевдокод, я его еще не тестировал.

rails g model Tech usage_count::integer description:text icon_url:string и т. Д. Запустите миграцию. Обратите внимание

Теперь в контроллере вам нужно будет увеличивать usage_count каждый раз, когда что-то происходит, пользователь отправляет новый вопрос, помеченный заданным текстом.

rails g model Name::Tech belongs_to:Tech name:string

Name::Tech model
  belongs_to :tech
end

Тогда вы можете искать что-то вроде:

search = Name::Tech.where("name LIKE :prefix", prefix: "word_start%")
.joins(:tech)
.order(usage_count: desc)
.limit(5) 

Это отправная точка. Он принципиально отличается от драгоценного камня, поскольку каждый тег представляет собой отдельную строку, но ссылается на более обширную таблицу данных на задней стороне. Я буду работать над внедрением и вернусь к обновлению с лучшим решением.

person James L.    schedule 05.08.2017