Как создать систему тегов, как в Stack Overflow или Quora - PullRequest
10 голосов
/ 31 марта 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

13 голосов
/ 08 июня 2011

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

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

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

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

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

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

0 голосов
/ 05 августа 2017

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

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

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

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

Теперь в контроллере вам нужно будет увеличивать use_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) 

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

...