Системы геймификации или репутации стали довольно популярными среди веб-приложений и мобильных приложений. Отслеживание активности пользователей помогает веб-сайтам определять, кого следует поощрять, и поощряет пользователей вносить свой вклад. Такие сайты, как StackOverflow и Foursquare, являются двумя распространенными приложениями, которые во многом обязаны своим успехом геймификации. Эти системы репутации уже давно используются на форумах и в сообществах и хорошо работают для привлечения качественных пользователей.
Есть пара драгоценных камней, которые могут помочь в создании игрового процесса для пользователей. Одна из жемчужин, которую я считаю весьма полезной, настраиваемой и ухоженной, — это заслуга .
Простое правило, лежащее в основе геймификации, заключается в том, что когда пользователь выполняет действие или достигает измеримой цели, существует вознаграждение. Например:
* Когда пользователь комментирует 10, ему дается значок критического анализа.
* Когда пользователь публикует 5 статей, ему присваивается значок Junior Contributor.
Настройка заслуги
Чтобы начать работу с Merit, добавьте следующий код в ваш файл gem.
gem 'merit'
бегать
bundle install
Как только комплект завершен, добавьте инициализатор и миграцию. Инициализатор упоминает название значков, которые мы хотим использовать. Мы также можем определить, какое хранилище данных мы планируем использовать (PostgreSQL или mongoDB). В миграции указывается модель, которую необходимо «геймифицировать». Например, мы собираемся отслеживать активность пользователей, поэтому нам нужно добавить миграцию в модель User:
bundle exec rails g merit:install => Creates the initializer in /config/initializer/merit.rb bundle exec rails g merit model_name (eg: user) => would add has_merit to the user model
Теперь перенесите базу данных:
bundle exec rake db:migrate
Еще одна папка, о которой следует знать, это app / models / merit / * . В этом каталоге содержатся определения правил для значков, предоставляемых пользователям. Возможность писать правила в простом Ruby-файле является одним из основных преимуществ использования Merit. Использование файлового подхода делает его очень настраиваемым.
Давайте создадим наш первый значок.
Значки, которые мы планируем использовать, должны быть записаны в файле инициализатора config / initializers / merit.rb . Метод для создания значка — Merit::Badge.create!
, Он принимает следующие параметры:
-
:id
целое число (обязательно) -
:name
это как вы ссылаетесь на значок (обязательно) -
:level
(необязательно) -
:description
(необязательно) -
:custom_fields
хэш всего, что вы хотите связать со значком (необязательно)
Пример:
Merit::Badge.create!( id: 1, name: "Jr.Critic", description: "Over 10 comments" ) Merit::Badge.create!( id: 2, name: "Sr.Critic", description: "Over 50 comments" )
Как только значок создан, пришло время определить правила для присуждения этого значка пользователю. Как упоминалось ранее, правила присуждения значка определены в папке app / models / merit / * . Нам нужно создать файл с названием badge_rules.rb . Обратите внимание, что мы можем предоставить временный или постоянный значок. Временный значок аннулируется, когда его правила больше не выполняются.
Правила определяются путем вызова метода grant_on
и предоставления блока. Параметры, которые для этого метода:
-
'controller#action'
— имя контроллера и действие, которое запускает блок -
:badge
— The:name
значка -
:level
—:level
:level
значок -
:to
— Имя объекта, который содержит получатель значка. Ему нужна переменная с именем@model
в связанном действии контроллера, например,@post
дляposts_controller.rb
или@comment
дляcomments_controller.rb
- Может быть именем метода, который вызывается поверх целевого объекта, должен извлекать объект на значок. Если это
:user
например, заслуга внутренне позвонит@model.user
чтобы найти, кого@model.user
- Может быть
:itself
, в этом случае он@model
сам объект цели (@model
) - Is
:action_user
по умолчанию, что означаетcurrent_user
- Может быть именем метода, который вызывается поверх целевого объекта, должен извлекать объект на значок. Если это
-
:model_name
— Определяет имя контроллера, если оно отличается от имени модели (например,RegistrationsController
для моделиUser
). -
:multiple
— может ли значок быть предоставлен несколько раз. по умолчаниюfalse
-
:temporary
— должен ли значок быть отозван, если условие больше не выполняется.false
значения сохраняются навсегда по умолчанию. -
&block
— может быть одним из следующих:- Пусто / не включено: всегда выдавать значок
- Блок, который оценивает как логическое. Он получает целевой объект в качестве параметра (например,
@post
если вы работаете с действиемPostsController
). - Блок с хешем, состоящим из методов для запуска на целевом объекте и ожидаемых возвращаемых значений метода
Пример:
# app/models/merit/badge_rules.rb grant_on 'comments#create', badge: 'Jr.Critic', to: :user do |comment| comment.user.comments.count >= 10 && comment.user.comments.count < 50 end grant_on 'comments#create', badge: 'Sr.Critic', to: :user do |comment| comment.user.comments.count >= 50 end
Из приведенного выше кода видно, что значок «Младший критик» будет действовать только до тех пор, пока количество комментариев пользователя больше 10 и меньше 50. Когда количество его комментариев становится больше 50, будет выпущен новый значок и значок «Младший» будут удалены
Чтобы получить доступ к значкам текущего пользователя (при условии, что ваш вошедший в систему пользователь известен как current_user
):
current_user.badges
Если вы хотите добавить / удалить значки вручную, используйте:
current_user.add_badge(badge.id) current_user.rm_badge(badge.id)
Пример использования в описанной выше ситуации — когда вы хотите дать значок «Премиум-пользователь» для платящих клиентов. Вместо того чтобы писать правило и проверять его много раз, просто добавьте его из контроллера платежей и выполните действие.
Система очков
Отсюда мы можем построить классную систему репутации, но она не будет полной без отображения очков. Расчет очков аналогичен системе бейджей. Определите правила для точек в файле с именем (как вы уже догадались) app / models / merit / point_rules.rb .
Очки настраиваются с помощью метода score
который принимает те же параметры, что и система бейджей.
Например, если вам требуется, чтобы очки пользователя увеличивались на единицу, когда он комментирует статью:
score 1, on: 'comments#create', to: [:user] score 5, on: 'comments#vote_up', to: [:comment_owner]
:user
— это атрибут модели (комментария), который указывает на пользователя. В случае vote_up
на владельца комментария ссылался атрибут в модели Vote
как comment_owner
.
Вы можете вручную добавлять очки, как значки:
current_user.add_points(20, category: 'Optional category') current_user.subtract_points(10, category: 'Optional category')
Чтобы найти очки, начисленные с указанной даты, например, для списка лидеров используйте:
score_points = current_user.score_points(category: 'Optional category') score_points.where("created_at > '#{1.month.ago}'").sum(:num_points)
Система ранжирования
Как и очки, так и значки, рейтинг определяется в app / models / merit / rank_rules.rb .
Правила ранжирования создаются методом set_rank
. Параметры следующие:
-
:level
—:level
рейтинга (чем больше, тем лучше, лексикографический порядок) -
:to
— Модель или область, чтобы проверить, применяются ли новые рейтинги -
:level_name
— имя атрибута (по умолчанию пусто и приводит к атрибуту ‘level’, если установлен, он добавляется как ‘level _ # {level_name}’)
Пример:
set_rank level: 2, to: User.active do |user| user.comments > 10 && user.followers >= 10 end
Это больше функциональности доступно с заслугой. Используя что-то вроде ActiveRecord Observer, легко отслеживать присуждаемые значки / баллы и создавать необходимые уведомления для пользователей. Попробуйте жемчужину и привнесите геймификацию и, таким образом, больше вовлеченности в свое веб-приложение.