Tutorial apple locomotive


#1

bonjour

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 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 :wink:

puis on crée une table expense que l’on relie (belong_to et has_many
l’une et l’autre )

je passe en mode console pour rajouter des dépenses

That command loads the application into an interactive environment,

and prompts you to enter Ruby code. Let’s add two
expenses to an existing account. Using one of the account names you
created through the web interface, type the following
lines, with each line followed by a Return:
>> account = Account.find_by_name(“Chili Cookoff”)

et paf première réponse
=> nil

je me dis c’est pas grave, je continue mais les lignes suivantes me
donnent toutes une erreur

account.expenses.create(:paid_on => Time.now, :payable_to =>
‘Parties R Us’, :amount => 75.00)
NoMethodError: You have a nil object when you didn’t expect it!
The error occured while evaluating nil.expenses
from (irb):5

account.expenses.create(:paid_on => 1.day.ago, :payable_to =>
‘Fire Department’, :amount => 25.00)
NoMethodError: You have a nil object when you didn’t expect it!
The error occured while evaluating nil.expenses

résultat je bloque et ne comprends guère .
merci si vous avez une idée …

N G


conseil formation et webdesign
http://www.gilgam.com
blog
http://babel.ouvaton.org


#2

Le 04/04/06, Gilgam conseil et webdesign removed_email_address@domain.invalid a écrit :

on scaffolde le tout :wink:
you
created through the web interface, type the following
lines, with each line followed by a Return:
>> account = Account.find_by_name(“Chili Cookoff”)

Si tu appelle une classe Account elle va cherche a utiliser une table
accounts a cause de l’utilisation du pluriels de rails, essaie de
renommer
ta table.

et paf première réponse

account.expenses.create(:paid_on => 1.day.ago, :payable_to =>
‘Fire Department’, :amount => 25.00)
NoMethodError: You have a nil object when you didn’t expect it!
The error occured while evaluating nil.expenses

Les erreurs sont normals ta premiere commande t’a renvoie nil, soit un
objet
null qui ne peut donc pas etre utilise.

résultat je bloque et ne comprends guère .


#3

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à :

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 :wink:

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 :slight_smile:

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é :slight_smile:

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.


#4

j’ai vu cela mais je ne pensais pas que cela soit rigide à ce point .
si l’on vceux nommer des tables en français est-ce rails ajoute un
s . j’ai vu aussi qu’il gérait les pluriels variants en anglais. fort
mais sur des mots français il fait comment ?

Rails part du principe que les mots utilisés sont en Anglais.
Aussi le français “Monsieur” deviendra-t-il “Monsieurs”.
En revanche, rien n’oblige à suivre cette convention.
On peut désactiver la pluralisation des noms en spécifiant
ActiveRecord::Base.pluralize_table_names = false dans le fichier
environment.rb.
Enfin, on peut remplacer le nom de la table que Rails recherche pour
un modèle en écrivant set_table_name “le nom” dans le modèle, par
exemple :

class Monsieur < ActiveRecord::Base
set_table_name “messieurs”
end

c’est quoi des tuples ?

Un tuple est le nom “scientifique” d’un enregistrement dans une table
d’une base de données.

N’oubliez pas #rubyonrails.fr @ Freenode !


Guillaume “Zifro” DESRAT
http://…/
– Aah Jeez…I Wish You Could See This…Lights Coming Up…I’ve
Never Seen A Painting That Captures The Beauty Of The Ocean…I’m
Gonna Make You Rich, Bud Fox…Rich Enough You Can Afford A Girl Like
Darien…This Is Your Wake-Up Call, Pall…Go To Work…DROP IT!!!
(3 Steps Ahead - Drop It)


#5

account on scaffolde le tout :wink:

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 :slight_smile:

Donc si on suit les conventions de Rails, tu la nommes accounts.

Pareil, elle doit s’appeler expenses.

j’ai vu cela mais je ne pensais pas que cela soit rigide à ce point .
si l’on vceux nommer des tables en français est-ce rails ajoute un
s . j’ai vu aussi qu’il gérait les pluriels variants en anglais. fort
mais sur des mots français il fait comment ?

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.

oui

c’est quoi des tuples ?

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.

:wink:

merci pour les explications.

Nicolas Gruson


#6

Salut Nicolas,

s . j’ai vu aussi qu’il gérait les pluriels variants en anglais. fort
mais sur des mots français il fait comment ?

Rails les considère comme des mots anglais et appliquent les
règles de grammaire qu’il a apprises :slight_smile:

Donc si ça ne marche pas, tu peux lui spécifier la bonne orthographe.

Dans config/environment.rb, tu rajoutes :

Inflector.inflections do |inflect|
inflect.irregular ‘cheval’, ‘chevaux’
end

Après il faut voir si ce n’est pas mieux de tout coder en anglais,
plutôt que de faire un mélange hasardeux :

class Ecurie < ActiveRecord::Base
has_many :chevaux
belongs_to :proprietaire
end

On dirait du Jane Birkin :slight_smile:

[…]

c’est quoi des tuples ?

Dans le jargon des bases de données, c’est un élément
stocké dans une table, ça correspond à une ligne en quelque
sorte. C’est un ensemble de n valeurs, on appelle donc ça aussi
un n-uplet.

Avec la magie des mappeurs objets relationnels, ici en
l’occurrence ActiveRecord, Ã un tuple va correspondre
une instance de ta classe, Account par exemple. Je m’en
sers pour éviter de répéter les mots ligne, entrée ou donnée
d’une table.

-- Jean-François.