Статьи

Усилить взаимодействие с заслугами и игрофикацией

Системы геймификации или репутации стали довольно популярными среди веб-приложений и мобильных приложений. Отслеживание активности пользователей помогает веб-сайтам определять, кого следует поощрять, и поощряет пользователей вносить свой вклад. Такие сайты, как 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, легко отслеживать присуждаемые значки / баллы и создавать необходимые уведомления для пользователей. Попробуйте жемчужину и привнесите геймификацию и, таким образом, больше вовлеченности в свое веб-приложение.