Forum: Rails France Probleme validates_associated

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
=?iso-8859-1?b?SmVhbi1GcmFu529pcw==?= Rouanet (Guest)
on 2006-01-23 19:39
(Received via mailing list)
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
Franck (Guest)
on 2006-01-23 20:43
(Received via mailing list)
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/Val...

bon courage
Franck


On 1/23/06, Jean-François Rouanet
<removed_email_address@domain.invalid>
jf (Guest)
on 2006-01-24 12:45
(Received via mailing list)
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
Frederic Delorme (Free) (Guest)
on 2006-01-27 01:24
(Received via mailing list)
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.
Franck (Guest)
on 2006-01-27 09:32
(Received via mailing list)
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
jf (Guest)
on 2006-01-27 10:09
(Received via mailing list)
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
jf (Guest)
on 2006-01-27 10:18
(Received via mailing list)
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
Vincent J. (Guest)
on 2006-01-30 16:58
(Received via mailing list)
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 :
jf (Guest)
on 2006-01-31 12:09
(Received via mailing list)
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
This topic is locked and can not be replied to.