2010-01-03 3 views
1

J'ai un modèle user dans lequel j'ai une méthode pour voir si l'utilisateur a gagné un « badge »rails, `flash [: remarque]` dans mon modèle?

def check_if_badges_earned(user) 
    if user.recipes.count > 10 
    award_badge(1) 
end 

S'ils ont gagné un badge, les pistes de méthode award_badge et donne à l'utilisateur le badge associé . Puis-je faire quelque chose comme ça?

def check_if_badges_earned(user) 
    if user.recipes.count > 10 
    flash.now[:notice] = "you got a badge!" 
    award_badge(1) 
end 

Question supplémentaire!(boiteux, je sais)

Où serait le meilleur endroit pour moi de garder toutes ces « conditions » pour que mes utilisateurs peuvent gagner des badges, semblable à stackoverflows badges je suppose. Je veux dire en termes d'architecture, j'ai déjà badge et badgings modèles.

Comment puis-je organiser les conditions dans lesquelles ils sont gagnés? Certains d'entre eux sont complexes, comme l'utilisateur s'est connecté 100 fois sans commenter une seule fois. etc. Donc il ne semble pas y avoir un endroit simple pour mettre ce genre de logique car il couvre à peu près tous les modèles.

Répondre

4

Je suis désolé pour vous mais le hachage flash n'est pas accessible dans les modèles, il est créé lorsque la demande est traitée dans votre contrôleur. Vous pouvez toujours utiliser la mise en œuvre de votre méthode de stockage des infos de badge (message flash inclus) dans un objet badge qui appartient à vos utilisateurs:

class Badge 
    # columns: 
    # t.string :name 

    # seed datas: 
    # Badge.create(:name => "Recipeador", :description => "Posted 10 recipes") 
    # Badge.create(:name => "Answering Machine", :description => "Answered 1k questions") 
end 

class User 
    #... 
    has_many :badges  

    def earn_badges 
    awards = [] 
    awards << earn(Badge.find(:conditions => { :name => "Recipeador" })) if user.recipes.count > 10 
    awards << earn(Badge.find(:conditions => { :name => "Answering Machine" })) if user.answers.valids.count > 1000 # an example 
    # I would also change the finds with some id (constant) for speedup 
    awards 
    end 
end 

alors:

class YourController 
    def your_action 
    @user = User.find(# the way you like)... 
    flash[:notice] = "You earned these badges: "+ @user.earn_badges.map(:&name).join(", ") 
    #... 
    end 
end 
+0

Une sacrément bonne réponse. –

Questions connexes