Hello,
j’ai réussi à faire marcher ROR sur mon mac en se coneectant sans
problèmes sur le serveur mysql installé via serverlogistics.
j’ai donc commencé par le tuto d’apple
Il aurait été bon de rappeler l’url pour nous faire gagner du temps,
il est là :
http://developer.apple.com/tools/rubyonrails.html
mais je bloque (déjà ?) sur le
passage en mode console.
je résume on créée une appli expenses avec une première table
account on scaffolde le tout
Attention, il faut être très attentif ou méticuleux en ce qui concerne
les problèmes de singulier/pluriel car Rails est aussi très porté
là -dessus
Donc si on suit les conventions de Rails, tu la nommes accounts.
puis on crée une table expense que l’on relie (belong_to et has_many
l’une et l’autre )
Pareil, elle doit s’appeler expenses.
Dans le tutorial, il montre l’interface web générée par l’échafaudage
(scaffolding), est-ce que ça a marché de ton côté ? Après, l’article
passe rapidement dessus mais c’est de cette manière qu’ils ont
créé des tuples dans la table accounts comme le tuple
concernant le Chili Cookof.
et paf première réponse
=> nil
je me dis c’est pas grave,
Ben si, tu sais bien, si une ligne de code en info ne marche pas,
les lignes de code suivantes qui en découlent peut-être peuvent
ne pas marcher non plus.
NoMethodError: You have a nil object when you didn’t expect it!
The error occured while evaluating nil.expenses
“You have a nil object when you didn’t expect it!” est une erreur
que tu risques (malheureusement) de rencontrer de temp en temps,
alors voilà une petite explication :
account = Account.find_by_name(“Chili Cookoff”)
Que doit faire cette ligne ? Elle dit de retourner un objet de
la classe Account et account devient une référence sur cet objet.
Or, elle retourne nil. account est alors une référence sur l’objet nil
(de la classe NilClass). Donc l’objet que tu manipules dans les
lignes suivantes n’appartient ni à la classe Account, ni encore
moins à la classe ActiveRecord::Base qui te permet de
faire pleins de manipulations sympathiques avec ta base de données.
Avec ou sans associations d’ailleurs.
avec account qui vaut nil, tu n’auras donc pas en particulier la
méthode expenses nécessaire à la bonne exécution des lignes
suivantes.
D’où le message d’erreur : “You have a nil object when you
didn’t expect it! The error occured while evaluating nil.expenses”
Tu t’attendais à un objet de classe Account et tu as un objet nil.
Et si tu en as un, si Account.find_by_name(“Chili Cookoff”)
n’a pas marché, c’est qu’il ne l’a pas trouvé (erreur de typo ?
table vide ?)
Donc pour créer ton entrée dans la table accounts, deux choix,
1/ utiliser l’interface web générée par le scaffold
2/ le créer dans la console :
a = Account.new
a.name = “Chili Cookoff”
a.budget = 150.0
a.save
Tu peux tester d’ailleurs les différentes façons de créer un
objet Account :
Account.new do |a|
a…name = “Chili Cookoff”
a.budget = 150.0
a.save
end
a = Account.create( :name => “Chili Cookoff”, :budget => 150.0)
Chaque fois que tu as une erreur “You have a nil object when you
didn’t expect it”, ça veut dire que tu essaies d’appeler une
méthode que nil ne possède pas, ça veut dire que ta variable
se réfère à nil et ne le devrait pas, ça veut dire que l’assignation
ne s’effectue pas comme tu le voudrais, il faut alors chercher le bug
de ce côté.
A noter que nil possède bien des méthodes, tu peux faire un :
nil.public_methods
ou nil.private_methods
ou nil.class …
tu peux le convertir en String : nil.to_s, en Float nil.to_f
en Integer, nil.to_i mais tu verras ça reste assez limité
enfin, autre remarque, l’article passe un peu rapidement aux
associations. Pour se familiariser, il vaut mieux dans un premier
temps “jouer” avec un modèle à la fois (en l’occurrence Account)
et créer, mettre à jour, rechercher (jouer avec find), effacer… des
objets de classe Account. Puis seulement dans un second temps,
“jouer” avec les modèles Account et Expense en même temps.
résultat je bloque et ne comprends guère .
merci si vous avez une idée …
– Jean-François.