Validation d'une methode dans un model

Bonjour à tous,

Je viens de poster un article (en anglais) sur mon blog qui pourras
peut-être aider certains.

L’objectif du code fournis: proposer une solution simple et flexible de
valider une method dans un model.

Exemple:
Valider la method “role” de l’objet “user”.

validates_method_of :user, :method => ‘role’, :only => %w( owner admin )

Article:

http://seb.box.re/articles/2006/08/28/validates_method_of

Vos commentaires sont les bienvenue :wink:

Sébastien Grosjean - ZenCocoon

Salut Sébastien,

Article:

http://seb.box.re/articles/2006/08/28/validates_method_of

Vos commentaires sont les bienvenue :wink:

Rq rapide :

method = value.send(“#{configuration[:method]}”)

comme je l’ai déjà fait remarquer récemment à un autre
colistier, pour moi l’idiome : “#{obj}” se remplace plus
simplement par obj.to_s
A moins d’une subtilité qui m’ait échappé.

mode Stefan K.
tu évites de plus, la création d’une String, ce qui coûte
en ressources.
fin mode SK

la substitution #{…} est utile quand simultanément
tu concatènes une chaîne avant ou après :

“foo#{obj}”
“#{obj}bar”
“foo#{obj}bar”

donc :

method = value.send(configuration[:method].to_s)

Sinon je n’ai pas regardé ton code en profondeur.
(ni réfléchi à l’utilité)

A+

– Jean-François.

Salut Jean-François

Jean-François wrote:

tu évites de plus, la création d’une String, ce qui coûte
en ressources.

method = value.send(configuration[:method].to_s)

Merci pour cette information, je viens de mettre à jour le code.

Sinon je n’ai pas regardé ton code en profondeur.
(ni réfléchi à l’utilité)

A+

– Jean-François.


Sébastien Grosjean - ZenCocoon

Salut,

Le 28 août 06, à 12:32, Sébastien Grosjean (ZenCocoon) a écrit :

L’objectif du code fournis: proposer une solution simple et flexible
de valider une method dans un model.

Exemple:
Valider la method “role” de l’objet “user”.

validates_method_of :user, :method => ‘role’, :only => %w( owner admin
)

Je trouve ça étrange, à moins que je n’aie pas compris le but :wink:
validates_* signifie valider des données (entrées par l’utilisateur ou
reçues d’une requête web).
Que signifie valider une méthode ?
Ou bien est-ce utile dans des tests ?

Jean-Christophe M.

Symétrie, édition de musique et services multimédia
30 rue Jean-Baptiste Say
69001 LYON (FRANCE)
tél +33 (0)478 29 52 14
fax +33 (0)478 30 01 11
web www.symetrie.com

Salut tous le monde,

Nicolas P. wrote:

Amicalement,
NP

Il semble que ce bout de code (ou fonction) ne soit clair pour personne
:wink: alors je vais essayer me mieux expliquer son but. Pour cela je vais
expliquer pourquoi j’en ai eu besoin et le service que cette fonction me
rend actuellement. (Il est fort possible qu’un autre system existe, mais
je ne le connai pas).

Dans mon cas, j’ai une appli avec administration et plusieurs types
dâ??utilisateurs, définis par la variable “role”:

  • owner
  • admin
  • guest

Dans la pratique, il existe 3 parties pour cette appli:

  • semi-public: consultable par tous type d’utilisateur “guest”, “admin”
    ou “owner”
  • admin: accessible par les “admin” ou “owner”
  • certaines sections restreinte de l’admin: accessible uniquement aux
    “owner”

Bref voici pour les possibilités de chaque utilisateur.

Le site ayant pour fonction de créer des articles (genre blog) je veux
être sur que personne de non autorisé n’aille poster un article.

Pour cela je souhaitai contrôler cella dans le model “article”, cela me
semble le meilleur endroit pour faire une validation.

Voici par exemple les models “user” et “article”

class User < UserRecord::Base
has_many :articles
end

class Article < ArticleRecord::Base
belongs_to :user

validates_presence_of :user
validates_associated :user
validates_method_of :user, :method => ‘role’,
:only => %w( owner admin )
end

Maintenant voyons comment ca ce passe du coté contrôleur pour ajouter un
article:

def new
@article = Article.new(params[:article])

if request.post?
@article.user = @session[‘article’]
if @article.save
flash[‘notice’] = “New article created successfully.”
redirect_to :action => ‘list’
end
end
end

Avec ce genre de code, ma fonction me permet de vérifier que la méthode
“role” de l’utilisateur postant l’article et bien équivalente à “admin”
ou “owner”, dans le cas contraire, l’article ne serra pas posté.

Voici en ce qui concerne mon utilisation actuelle.

Ceci est donc pratique pour vérifier comme ici, la présence ou
l’exclusion d’une valeur située dans la méthode d’un objet parent.

Comme par exemple dans un model image:

class Image < ImageRecord::Base
belongs_to :article

validates_method_of :article, :method => ‘accept_images’,
:only => %w( true ),
:message => ‘Images not allowed in this article.’
end

Ou encore par exemple avec un model “article”:

class Article < ArticleRecord::Base
belongs_to :user

validates_method_of :user, :method => ‘status’,
:except => %w( suspended ),
:message => "User suspended can’t post article.’
end

J’espère que ces explications vous aideront à mieux comprendre, si toute
fois il reste des flous faites le moi le savoir et je ferrai de mon
mieux pour expliquer à nouveau.

Bonne soirée,

Salut,

Le 28 août 06, à 21:29, Sébastien Grosjean (ZenCocoon) a écrit :

  • admin
  • guest

C’est ce que je soupçonnais, c’est plutôt de l’autorisation
(d’utilisateur) que de la validation (de données).

Pour cela je souhaitai contrôler cella dans le model “article”, cela
me semble le meilleur endroit pour faire une validation.

En MVC je crois que les actions (donc dans le controller) sont plus
adaptées que le modèle.
Regarde par exemple active_rbac et son before_filter.

Ceci est donc pratique pour vérifier comme ici, la présence ou
l’exclusion d’une valeur située dans la méthode d’un objet parent.

Si ça marche et que ça te convient, c’est bien :wink:
Cependant le vocabulaire est inapproprié amha. Je garderais validates_*
pour les données et
renommerais par exemple en check_if_value ou check_object_value.

Jean-Christophe M.

Symétrie, édition de musique et services multimédia
30 rue Jean-Baptiste Say
69001 LYON (FRANCE)
tél +33 (0)478 29 52 14
fax +33 (0)478 30 01 11
web www.symetrie.com

Salut Seb,

Je trouve ça étrange, à moins que je n’aie pas compris le but :wink:

Je dois avouer, je n’ai pas bien compris non plus à quoi cela
servait. (surtout de la manière dont c’est formulé, validates_method !?)

Peux-tu nous expliquer à nouveau pour que l’on puisse éventuellement
profiter de ta création ?

Amicalement,
NP

Jean-Christophe M. wrote:

Dans mon cas, j’ai une appli avec administration et plusieurs types
dâ??utilisateurs, définis par la variable “role”:

  • owner
  • admin
  • guest

C’est ce que je soupçonnais, c’est plutôt de l’autorisation
(d’utilisateur) que de la validation (de données).

Bien pas vraiment en fait, dans le cas que je cité en premier peut y
faire penser c’est vrai mais ce n’est pas son but.

Je gére l’autorisation ailleur dans un controller avec before_filter.
Ala active_rbac

Pour cela je souhaitai contrôler cella dans le model “article”, cela
me semble le meilleur endroit pour faire une validation.

En MVC je crois que les actions (donc dans le controller) sont plus
adaptées que le modèle.
Regarde par exemple active_rbac et son before_filter.

Comme dis plus haut, je fonctionne aussi comme cela.

Ceci est donc pratique pour vérifier comme ici, la présence ou
l’exclusion d’une valeur située dans la méthode d’un objet parent.

Si ça marche et que ça te convient, c’est bien :wink:

lol, nous somme d’accord que c’est le principal :wink:

Cependant le vocabulaire est inapproprié amha. Je garderais validates_*
pour les données et
renommerais par exemple en check_if_value ou check_object_value.

En effet un renomage peut savérer stratégique pour rendre cette fonction
plus compréhensible. Hors il me reste en tête que ceci est purement de
la validation de données, comme n’importe autre validates_* function.
Seul nuance, elle valide une methode situé dans un objet parent.

Merci pour tes commentaires.