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.
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] )
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 "
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.
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…
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.
Là tu tombes sur un des grands plaisirs de rails : te renvoyer chier
quand tu ne fais pas ce qu’il veut
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
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
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.
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.