rails que puede programar hacer con caracteristicas aprender ruby-on-rails ruby achievements

ruby on rails - que - Herramientas modernas para Ruby/Rails para construir un sistema de logros.



que se puede hacer con ruby on rails (4)

¿Has mirado a Badgeable ?

Estoy interesado en crear un sistema sólido de logros para mi aplicación Ruby on Rails.

Los logros pueden suceder de muchas maneras. Normalmente, tendríamos algunos criterios que pueden suceder en varios modelos, algunos requeridos, algunos opcionales (combinación y combinación) que desencadenan un logro.

Yo diría que esto es similar al sistema de logros aquí o las insignias de Foursquare. Idealmente, si existe una herramienta moderna que pueda ayudar a resumir gran parte del trabajo en algunos DSL, sería fantástico.

Estoy interesado en ver cómo otros resolvieron este problema usando Ruby o Ruby on Rails. Construir esto desde cero suena irrazonable ya que estoy seguro de que se ha resuelto muchas veces repetidamente.



Un sistema de logros parece simple a primera vista pero puede volverse bastante complejo rápidamente.

Primero, debe identificar qué tipo de logros desea proporcionar. Puedes premiar:

  1. Insignias
  2. Puntos
  3. Rangos

Por supuesto, también querrás hacer varias combinaciones de esos. Las características no obvias pero frecuentes son:

  • La capacidad de conocer su progreso hacia un rango específico o distintivo .
  • la posibilidad de ocultar algunas insignias

En el mundo de RoR, he encontrado 3 bibliotecas de terceros disponibles de forma gratuita. Como de costumbre, no hay una solución mágica y debe elegir una de acuerdo con sus necesidades.

Badgeable

Badgeable es un DSL simple que implementa solo un sistema de credenciales . Es dinámico y simple de entender. Este ejemplo es de la documentación oficial:

badge "Fancy Pants" do thing Meal subject :person count Meal.where(:price_cents.gte => 10000).count >= 12 end conditions do |meal| meal.restaurant.city != meal.eater.city end end

Otorgaría la insignia de Fancy Pants al comensal que ha comido 12 comidas caras donde la comida de adjudicación estaba fuera de la ciudad. Incluye características interesantes como la insignia invisible , pero no puede otorgar la misma insignia varias veces. Por defecto, Badgeable agrega ganchos después de la creación del registro observado. En el ejemplo anterior, la condición de distintivo se ejecuta después de cada creación de comida .

Es compatible tanto con ActiveRecord y Mongoid.

Caminos de la gloria

Paths of Glory es bastante diferente de Badgeable . Esta gema es más hacia puntos y rangos . Separa la lógica para calcular las insignias (observador) de la lógica para describir las insignias (clase de logro). Tal vez sería más natural para usted si ya utiliza el patrón Observer . Toma nota de que es Ruby puro, no hay DSL en Paths of Glory.

En la clase de Logros, describe sus niveles, lo que cuenta y cómo premiar los logros:

level 1, :quota => 2 level 2, :quota => 4 level 3, :quota => 6 set_thing_to_check { |user| user.posts.count } def self.award_achievements_for(user) return unless user return if user.has_achievement?(self) user.award_achievement(self) end

La parte del observador es muy clásica:

observe :post def after_save(post) Teacher.award_achievements_for(post.user) unless post.new_record? end

No está bien documentado pero puede encontrar una aplicación de ejemplo usándola here .

Incluye ayudantes para seguir el progreso al siguiente rango . Dado que utiliza las funciones de rieles clásicos, debe ser compatible con todos los rieles ORM disponibles.

Mérito

Merit parece ser la joya más completa sobre este tema, el cajero automático. Permite definir insignias , puntos y reglas con un DSL.

Para las insignias, parece que:

grant_on [''users#create'', ''users#update''], :badge => ''autobiographer'', :temporary => true do |user| user.name.present? && user.address.present? end

Verificará tanto la creación como la actualización si el usuario ha puesto su dirección. Se eliminará la insignia si el usuario elimina su dirección.

Para los puntos, es capaz de contar una puntuación basada en varios modelos:

score 20, :on => [ ''comments#create'', ''photos#create'' ]

Para los rangos, es bastante similar a las insignias. La diferencia está principalmente en el nivel :

set_rank :stars, :level => 2, :to => Commiter.active do |commiter| commiter.branches > 1 && commiter.followers >= 10 end set_rank :stars, :level => 3, :to => Commiter.active do |commiter| commiter.branches > 2 && commiter.followers >= 20 end

Esta gema también proporciona medios para calcular insignias o rangos en trabajos cron y no después de cada escritura en objetos:

task :cron => :environment do MeritRankRules.new.check_rank_rules end

Bajo el capó, Merit usa Ambry para almacenar información de credenciales . Debería ayudar a ambos a reducir el ruido en su almacén de datos y hacerlo un poco más rápido. Hay un soporte experimental disponible para MongoMapper. No he encontrado ningún medio para tener insignias invisibles o seguir el progreso hacia una insignia.