Belongs_to...Has_one etc

Alors voila je vous explique je suis un nouveau sur RoR et j’ai juste un
petit probleme.
J’ai créer une Table que l’on nommera “A”, celle ci contient des
elements concernant mes utilisateur du type, Name, Password etc.
Donc vous l’avez compris j’aimerais créer une sorte d’espace perso ou
l’utilisateur une fois enregistré pourrait voir a la fois que les
elements qu’il a poster (c’est a dire les elements correspondant stocké
dans une Table " B") et la fois tout les elements poster par les autres
utilisateurs et les siens ( c’est a dire l’integralité de ma table “B”),
(chacuns sur des pages rhtml differentes bien sur)

J’ai donc inscrit dans le model correspondant a la Table “B” :


class Blog < ActiveRecord::Base
belongs_to :users

Et dans celui correspondant a la Table “A” :

class User < ActiveRecord::Base
has_many :blogs

J’ai donc specifier la relation entre mes deux tables, Mais comment
faire pour indiquer a Ruby d’afficher sur une page Rhtml que les
elements de la Table “B” correspondant a l’utilisateur enregistré?

Veuillez excuser mon manque de clarté mais j’ai vraiment besoin de votre
aide.

Merci d’avance…

Le 10 sept. 06 à 11:37, Gary B. a écrit :

Salut,

J’ai donc specifier la relation entre mes deux tables, Mais comment
faire pour indiquer a Ruby d’afficher sur une page Rhtml que les
elements de la Table “B” correspondant a l’utilisateur enregistré?

Tu as sûrement voulu écrire has_one à la place de has_many.

Pour récupérer tout les blogs, il suffit de faire Blog.find(:all)
dans l’action de controlleur correspondant. Pour obtenir les Blogs
appartenant à un utilisateur donné, il faut faire : User.find(params
[:id_utilisateur].blogs.

Voilà, en espérant t’avoir
aidé.–
Nicolas C.

2006/9/10, Gary B. [email protected]:

J’ai donc specifier la relation entre mes deux tables, Mais comment
faire pour indiquer a Ruby d’afficher sur une page Rhtml que les
elements de la Table “B” correspondant a l’utilisateur enregistré?

Si j’ai bien compris, un objet blog appartient à un utilisateur et un
utilisateur a plusieurs objets blogs, ok ?
Donc, dans tes tables, tu as :

blogs( id ,… - tous tes champs , … , user_id )
users( id , username, … )

Donc, pour ensuite avoir l’utilisateur d’un objet blog, tu as dans ton
controlleur:
#On prend l’objet blog correspondant à la requete
@blog = Blog.find_by_id( params[:id] )

Puis ensuite, dans ta vue, tu peux faire :

Utilisateur qui détient ce blog : <%= @blog.user.username %>

Ruby va t’instancier directement l’objet user qui correspondant à ton
objet
blog et te le rendra accessible via @monobj.user.

J’avoue que j’ai eu eu mal à cerner la question, j’espère ces éléments
permettent d’y répondre …

Bon courage,

Nicolas C. wrote:

Pour r�cup�rer tout les blogs, il suffit de faire Blog.find(:all)
dans l’action de controlleur correspondant. Pour obtenir les Blogs
appartenant � un utilisateur donn�, il faut faire : User.find(params
[:id_utilisateur].blogs.

Merci pour ton aide alors voila je n’y arrive toujours pas, voila
l’erreur:

ActiveRecord::RecordNotFound in Blog controllerController#

Couldn’t find User without an ID

pour le Blog.find(:all) ca marche tres bien mais par contre c’est pour
le User.find(params[:id_utilisateur]).blogs que cela coince ( je l’ai
rentrer dans le controlleur correspondant. Je te precise que je n’ai
aucune Foreign Key…

Je suis entrain de desesperer
que faire?
Merci encore

Alors voila une explication plus clair:
imaginons un site web ou:

  • un utilisateur pourrait poster un article qui serait par la suite
    visible par tout le monde
    Celui ci serait inclu dans une rubrique " voir tout les articles "

  • la est mon probleme :

Mais aussi cet utilisateur pourrait dans une rubrique special et apres
s’etre enregistré ne voir que ses propres articles…

J’espere avoir ete un peu plus clair,
Merci aussi a J.Delange mais voila ce que j’obtient apres avoir inserer
dans la vu

Utilisateur qui détient ce blog : <%= @blog.user.username
%>


You have a nil object when you didn’t expect it!
The error occured while evaluating nil.user

Merci a vous ,

Salut,


class Blog < ActiveRecord::Base
belongs_to :users

Et dans celui correspondant a la Table “A” :

class User < ActiveRecord::Base
has_many :blogs

D’après ce que j’ai compris tu veux bel-et-bien has_many. Par blogs,
tu entends peut-être plutôt posts, non ? Parce qu’un utilisateur ça
paraît normal qu’il ait un blog et que ce blog ait plusieurs posts
(ou billets en français) ; le nommage en tout cas n’est peut-être pas
parfait puisqu’il nous met dans la confusion et on a du mal à t’aider.

Bon je rafait comme j’ai compris (posts au lieu de blogs), on
reprendra si erreur de compréhension subsiste :


class Post < ActiveRecord::Base
belongs_to :users
end

Et dans celui correspondant a la Table “A” :

class User < ActiveRecord::Base
has_many :posts
end

class PostsController << AC # exemple…

def list
	@posts = Post.find(:all)
end

def show_all_by_user
	@posts = Post.find_by_user(params[:id])
end

end

L’adresse de //serveur/posts/show_all_by_user/1 # 1 étant l’id de ton
utilisateur… Si tu utilisais :id_utilisateur il te faudrait
modifier les routes et ce n’est pas une priorité ici.

à+NP_______________________________________________
Railsfrance mailing list
[email protected]
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance

Nicolas ton explication est super j’attend juste d’appliquer ce que tu
as dit une fois que j’aurais passer cette erreur, en effet j’ai creer la
foreign key liant la table blogs (ou posts) a la table users, mais
j’obtient l’erreur suivante lorsque je veux poster un message ( c’est a
dire au moment de l’action “create” )

Mysql::Error: #23000Cannot add or update a child row: a foreign key
constraint fails (demo/blogs, CONSTRAINT blogs_ibfk_1 FOREIGN KEY
(user_id) REFERENCES users (id)): INSERT INTO blogs etc…

que faire maintenant?
Merci

Le 10 sept. 06 à 13:56, Gary B. a écrit :

rentrer dans le controlleur correspondant. Je te precise que je n’ai
aucune Foreign Key…

Je suis entrain de desesperer
que faire?

Il faut évidemment remplacer :id_utilisateur par le nom du champ que
tu utilises dans ta vue. Également, si chaque blog appartient à un
utilisateur, il faut un champ user_id (de type integer) dans ta table
Blogs pour que Rails puisse lier le blog à un utilisateur. Sans
foreign key dans la table Blogs, ça ne peut pas fonctionner.

Nicolas C.

Salut,

Là tu tombes sur un des grands plaisirs de rails : te renvoyer chier
quand tu ne fais pas ce qu’il veut :slight_smile:

Le fait est que tu dois pouvoir faire ce que tu penses lui faire
faire là mais ça doit être sacrément moins facile que par la manière
officielle.
La vérité c’est que je ne vois pas trop (et ne cherche pas trop à
savoir) comment tu as eut cet SQL en particulier…

La manière officielle la voici :

une table blogs (ou posts)
une table users
dans la table blogs (ou posts) rajoute un colonne user_id

C’est tout, tout, tout. Avec ça, il n’y aura aucun problème.

À savoir create avec un jointure has_many, s’écrit couramment ainsi :

user = User.find(params[:id])
@blog = user.blogs.create(params[:blog]) # params[:blog] étant les
données retournées automatiquement par ton formulaire, s’il est bien
écrit

Si tu as une autre configuration de bdd, change vers ça ou décris-
nous ce que tu as et on essaiera de te connecter à test tables mais
vraiment prends plus l’habitude de la méthode rails pour commencer,
ne perds pas de temps pour le moment à faire des folies :slight_smile:

NP_______________________________________________
Railsfrance mailing list
[email protected]
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance

Pour les tables , elles sont structuré comme tu me l’a conseille , voila
ce que m’indique RoR quand je rajoute ceci dans mon controller :

def create
@blog = user.blogs.create(params[:blog])
end

undefined local variable or method `user’ for
#BlogControllerController:0xb75bf80c

Bizzare non?

user = User.find(params[:id])
@blog = user.blogs.create(params[:blog]) # params[:blog] �tant les
donn�es retourn�es automatiquement par ton formulaire, s’il est bien
�crit

Si tu as une autre configuration de bdd, change vers �a ou d�cris-
nous ce que tu as et on essaiera de te connecter � test tables mais
vraiment prends plus l’habitude de la m�thode rails pour commencer,
ne perds pas de temps pour le moment � faire des folies :slight_smile:

NP_______________________________________________
Railsfrance mailing list
[email protected]
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance

je suis desolé mais RoR ne peut pas automatiquement affcihé les posts du
users qui est connecté sans que l’on doit lui specifier le nom de l’id?
donc dans la page : mon espace, le user voit automatiquement ses
posts…

Merci en tous cas pour toutes vos reponses…

re

undefined local variable or method `user’ for
#BlogControllerController:0xb75bf80c

Bizzare non?

Pas trop :slight_smile:

Pour les tables , elles sont structuré comme tu me l’a conseille ,
voila
ce que m’indique RoR quand je rajoute ceci dans mon controller :

def create
@blog = user.blogs.create(params[:blog])
end

Tu as oublié une ligne…

user = User.find(params[:id])
@blog = user.blogs.create(params[:blog])

Attention pour que ceci marche ton formulaire doit être dirigé vers
:controller => ‘blog’, :acion => ‘create’, :id =>
id_du_user_qui_ajoute_le_blog
Mais comme tu as du faire script/generate controler BlogController
alors que Controller là n’était pas nécessaire, tu devras écrire
:controller => ‘blog_controller’, :acion => ‘create’, :id =>
id_du_user_qui_ajoute_le_blog

Ensuite c’est à toi de savoir comment tu veux définir dynamiquement
id_du_user_qui_ajoute_le_blog, fait le statiquement au départ…

J’espère que ça pourra t’avoir
aidé.
Apparemment, il te manque quelque bases de rails. Je te conseille la
lecture des quelques tutoriaux introductifs dont tu trouveras la
référence sur le site officiel (rubyonrails.org) et si cela est fait
passe immédiatement à Agile Programmation with Ruby on Rails (2nd éd.
en PDF) que tu trouveras en Français aux éditions Eyrolles (1ere éd.
en papier), tu ne seras pas déçu, c’est très sympathique à lire.

Amicalement,
NP_______________________________________________
Railsfrance mailing list
[email protected]
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance

Le 10 sept. 06 à 19:03, Gary B. a écrit :

je suis desolé mais RoR ne peut pas automatiquement affcihé les
posts du
users qui est connecté sans que l’on doit lui specifier le nom de
l’id?
Si tu avait mis en place un système d’authentification tu ne te
poserais même pas la question de savoir si c’était possible mais tel
quel tu ne semble pas savoir comment marche ni un modèle, ni un
contrôleur, et encore moins des sessions dans rails. Tu penses que
rails est capable de déterminer tout seul quel utilisateur visite ton
site ? il faut bien qu’il s’identifie, non ? Et quand il y a
identification, il y a en général session et conservation de l’id
d’un utilisateur qu’il est aisé de récupérer dans une action. Rails
est peut-être magique mais ce genre de magie a ses limites.

On aimerait toujours aller vite mais là il faut apprendre les bases.
Tu n’arrivera pas à faire marcher tout ça correctement sans en
apprendre plus.

Comme je t’ai dit précédemment lis le livre que je t’ai conseillé, ça
ira bien mieux après.

Bon courage,
NP_______________________________________________
Railsfrance mailing list
[email protected]
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance