Probleme validates_associated


#1

Bonjour.
Je débute avec Rails et je butte sur l’utilisation de
“validates_associated”.

Voici l’exemple de test:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Tables dans la base de données:

create table people (
id serial not null,
nom text,
prenom text,
primary key (id)
);

create table notes (
id serial not null,
id_person references people(id),
content text,
primary key (id)
);

Controllers:

controllers/note_controller.rb
class PersonController < ApplicationController
scaffold :person
end

controller/person_controller.rb
class NoteController < ApplicationController
scaffold :note
end

models/person.rb
class Person < ActiveRecord::Base
has_many :notes
end

models/note.rb
class Note < ActiveRecord::Base
belongs_to :person, :foreign_key => “id_person”
validates_associated :person
end

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Si j’insère dans la base une note avec un id_perso qui référence une
personne
qui n’existe pas l’erreur n’est pas interceptée par rails et la commande
d’insertion est transmise à postgres. La méthode “validates_associated” ne
devrait-elle pas déceler cette erreur avant de la transmettre à la base de
données?
Merci pour votre aide.

JF


ROUANET Jean-Francois
Responsable Regional Informatique INSERM AQUITAINE

INSERM ADR 9, Institut Francois Magendie
Rue Léo Saignat
33077 BORDEAUX CEDEX - FRANCE
Tel.: 05 57 57 36 50
Mobile: 06 87 83 64 12
mél: removed_email_address@domain.invalid


#2

Bonjour JF,

tu dois t’assurer que l’associé est bien présent avant de vérifier s’il
est
valide (validates_presence_of), sinon la validation ne retournera pas
d’erreurs.

plus de détails dans la doc :
http://ar.rubyonrails.com/classes/ActiveRecord/Validations/ClassMethods.html#M000229

bon courage
Franck

On 1/23/06, Jean-François Rouanet
removed_email_address@domain.invalid


#3

Le 23 janv. 06, à 19:41, Franck a écrit :

Bonjour Franck, merci pour ta réponse, mais même en rajoutant un
“validates_presence_of” j’ai toujours le problème. J’ai bien lu la doc
sur les validations, mais je dois avouer que je n’ai pas très bien
compris la remarque concernant l’utilité de “validates_presence_of”;
d’autant plus que je n’ai trouvé aucun exemple de code l’utilisant dans
tout ce que j’ai pu lire sur le sujet.
Aurais-tu un exemple de code fonctionnel qui utilise ce type de
validation?
Merci pour ton aide.

JF


#4

jf a écrit :

http://ar.rubyonrails.com/classes/ActiveRecord/Validations/
validation?
Merci pour ton aide.

JF


Railsfrance mailing list
removed_email_address@domain.invalid
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance

Je débute moi aussi en Rails, mais n’as-tu pas un soucis au niveau du
nomage du champs id_person dans la table notes ?
ne devrait-elle pas s’appeler id_people ?

je suis pas trop sur de mon coup, mais bon…

Bon courage.

Frederic.


#5

Le 26 janv. 06, à 20:33, Frederic Delorme (Free) a écrit :

exemple de code l’utilisant dans tout ce que j’ai pu lire sur le
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance

Je débute moi aussi en Rails, mais n’as-tu pas un soucis au niveau du
nomage du champs id_person dans la table notes ?
ne devrait-elle pas s’appeler id_people ?

je suis pas trop sur de mon coup, mais bon…

Non, j’ai mis un peu de temps à comprendre, mais c’est cette fichue
règle du pluriel: en anglais le pluriel de “person”, c’est “people”.
Par contre j’ai résolu le problème en supprimant le validates_associate
et en mettant simplement un “validates_presence_of :person”. La
validation vérifie que la personne existe dans la table en faisant une
requête à partir de id_person. Ca marche mais ça ne m’explique pas
quelle peut être l’utilisation du “validates_associates”.
J’ai fouillé dans les archives de la liste rails US et j’ai pu
constater que je n’étais pas seul à ne pas très bien comprendre!!
Bon courage également.
JF

ROUANET Jean-Francois
Responsable Regional Informatique INSERM AQUITAINE

INSERM ADR 9, Institut Francois Magendie
146 rue Leo Saignat
33077 BORDEAUX CEDEX - FRANCE

Tel.: 05 57 57 36 50
Mobile: 06 87 83 64 12
Fax: 05 57 57 36 26

mél: removed_email_address@domain.invalid


#6

Bonjour JF,

“validates_associated” permet de faire jouer les validations d’autres
models
lors de la validation du model principale. ainsi dans l’exemple suivant
:

Class Note << ActiveRecord::Base
belongs_to :person
validates_associated :person
end

Class Person << ActiveRecord::Base
has_many :notes
validates_presence_of :prenom
end

L’enregistrement d’une note passe par la validation de la présence du
prénom
de la personne. Par contre, si aucune personne n’est associée à la note
pendant l’enregistrement, la validation du prénom ne se fait pas. Afin
de
valider le prénom de la personne sur l’enregistrement d’une note, il
faudra
s’assurer de la presence de la personne, d’où l’ajout du
validates_presence_of
:person dans le model de la note (tu me suis ?) :

Class Note << ActiveRecord::Base
belongs_to :person
validates_presence_of :person
validates_associated :person
end

Perso, je ne vois pas l’intéret puisque si la personne associée est
présente, c’est qu’elle est valide (puisque validée durant un
enregistrement
précedent).

Ce type d’helpers doit servir lorsque tu crées la personne et la note
simultanément (même :action). Perso, je me débrouille autrement.

Franck


#7

Bonjour JF,
le “validates_associates” peut etre utile si tu as des regles de
validation
avancées (en utilisant la méthode “validate” du model), par exemple pour
un
format de date ou une validation d’après une regex.
Dans ton cas il n’y a pas vraiment d’interet.

Vincent

Le 27/01/06, jf removed_email_address@domain.invalid a écrit :


#8

Le 27 janv. 06, à 08:31, Franck a écrit :

l’ajout du validates_presence_of :person dans le model de la note (tu
enregistrement précedent).

Ce type d’helpers doit servir lorsque tu crées la personne et la note
simultanément (même :action). Perso, je me débrouille autrement.

Bonjour Franck.
Quel dommage que ce ne soit pas aussi clair dans la doc de rails!!
Merci pour ces explications. Effectivement je me suis aperçu qu’un
validates_presence_of person suffisait pour faire la vérification
souhaitée.
JF

ROUANET Jean-Francois
Responsable Regional Informatique INSERM AQUITAINE

INSERM ADR 9, Institut Francois Magendie
146 rue Leo Saignat
33077 BORDEAUX CEDEX - FRANCE

Tel.: 05 57 57 36 50
Mobile: 06 87 83 64 12
Fax: 05 57 57 36 26

mél: removed_email_address@domain.invalid


#9

Le 30 janv. 06, à 15:56, Vincent J. a écrit :

Bonjour JF,
le “validates_associates” peut etre utile si tu as des regles de
validation avancées (en utilisant la méthode “validate” du model), par
exemple pour un format de date ou une validation d’après une regex.
Dans ton cas il n’y a pas vraiment d’interet.

Bonjour Vincent.
Je crois que je commence à comprendre l’utilisation de
validates_associated: chaque fois que l’on fait une modification sur
l’objet concerné, les règles de validation de tous les objets associés
(par belongs_to, has_many, …) sont retestées. Effectivement, ce n’est
pas vraiment ce que je cherche à faire; un validates_presence-of
:person suffit.
Ais-je bien compris cette fois ?

Merci pour ton aide.

JF

ROUANET Jean-Francois
Responsable Regional Informatique INSERM AQUITAINE

INSERM ADR 9, Institut Francois Magendie
146 rue Leo Saignat
33077 BORDEAUX CEDEX - FRANCE

Tel.: 05 57 57 36 50
Mobile: 06 87 83 64 12
Fax: 05 57 57 36 26

mél: removed_email_address@domain.invalid