2010-11-02 6 views
0

est un modèle que je suis à la recherche pour voir s'il y a une façon intelligente de faire quelque chose comme ce qui suit ...Rails - Limitation du débit Créer

Dans mon application j'ai des projets. Je veux empêcher un utilisateur d'ajouter plus de 10 projets. Ma compréhension après avoir seulement utilisé des rails pendant quelques semaines, c'est que je devrais faire une aide dans mon modèle pour ça, est-ce que ça sonne bien?

Aussi est-ce que je devrais faire ceci au niveau de model/helper ou est-ce quelque chose qui devrait être fait pour tous les modèles avec un certain type de fichier de configuration? Donc l'idée est que, quand l'utilisateur crée un nouveau projet, before_create, il vérifie, si l'utilisateur a déjà plus de 10 projets, dit, désolé pas pour le moment? Aussi, intéressé par la façon de produire l'erreur msg, mais 1 étape à la fois pour un débutant.

grâce

+1

S'il n'y a pas de validateur intégré, vous pouvez en créer un personnalisé. – alternative

+0

ah très intéressant. DANS le modèle? Comment renvoyez-vous un message d'erreur avec un validateur? pouvez-vous donner un exemple léger pour me donner un coup de pied? – TheExit

Répondre

3

Faire cela comme une méthode de validation est assez simple. Dans Rails 3, vous déclarer juste une méthode à exécuter lors de la validation et il a la possibilité d'ajouter des erreurs si la situation se présente:

class Project 
    validate :user_can_create_projects 

protected 
    def user_can_create_projects 
    if (user and user.projects.count >= 10) 
     errors.add_to_base("You have created too many projects.") 
    end 
    end 
end 

Ce n'est pas une méthode entièrement l'épreuve des balles comme il y a une très petite chance Quelqu'un pourrait être en mesure de créer un projet entre l'intervalle lorsque vous vérifiez le nombre et quand vous créez réellement le projet. Ce genre de chose a beaucoup plus de chances de se produire lorsque quelqu'un double-clique sur un bouton de soumission de formulaire, par exemple, mais en pratique, il est relativement rare.

+0

très cool, si simple et élégant. J'aime ça. Mais, j'utilise Devise pour l'authentification. Et current_user n'est pas disponible dans le modèle, alors que fait-on pour obtenir l'utilisateur? – TheExit

+1

Vous avez besoin d'une association que vous pouvez suivre, ou vous devez créer un 'attr_accessor: user' simplement à cette fin. Dans votre contrôleur, vous l'affecteriez en conséquence. Vous pouvez également effectuer une validation de ce type dans le contrôleur si vous disposez de plus d'informations dans ce contexte. Une méthode 'user.can_create_more_projects?' Pourrait fonctionner mieux. – tadman

+0

Qu'est-ce que attr_accessor: user fait, pas grand-chose via Google. Aussi pour l'idée de contrôleur, quand je fais "Current_User.can_create_more_projects?" Dans le contrôleur, est-ce en utilisant le can_create_more_projects def dans le contrôleur ou est-ce qu'il vit encore dans le modèle, juste accédé par le contrôleur? Merci! – TheExit

Questions connexes