Afficher un enfant dans une vue

Bonjour,

le titre n’est pas trop explicite, mais j’ai pas trouvé mieux
Je suis novice en Rails et j’essaie d’afficher un champs qui se trouve
dans une relation.

Schema de la DB

ActiveRecord::Schema.define(:version => 20100130221503) do

create_table “accounts”, :force => true do |t|
t.text “account_number”
t.text “bank”
t.text “owner”
t.datetime “created_at”
t.datetime “updated_at”
end

create_table “depenses”, :force => true do |t|
t.date “datedepense”
t.decimal “credit”
t.decimal “debit”
t.integer “account_id”
t.integer “type_id”
t.datetime “created_at”
t.datetime “updated_at”
t.string “description”
t.string “code”
end

create_table “types”, :force => true do |t|
t.string “name”
t.datetime “created_at”
t.datetime “updated_at”
end

end

Model depense

class Depense < ActiveRecord::Base
belongs_to :account
validates_presence_of :account
belongs_to :type
end

Model type

class Type < ActiveRecord::Base
has_many :depense
end

views index.html.erb

Listing depenses

<% @depenses.each do |depense| %>

<% end %>
Datedepense Credit Debit Id account Id type description code
<%=h depense.datedepense %> <%=h depense.credit %> <%=h depense.debit %> <%=h depense.account_id %> <%=h depense.type_id %> <%=h depense.description %> <%=h depense.code %> <%= link_to 'Show', depense %> <%= link_to 'Edit', edit_depense_path(depense) %> <%= link_to 'Destroy', depense, :confirm => 'Are you sure?', :method => :delete %>

<%= link_to ‘New depense’, new_depense_path %>

dans la vue a la place de depense.type_id, j’aimerais
depense.types.name. ca ne marche pas et après plusieurs essaie de
définition de variable dans le controlleur, je sèche

ca ne marche pas et après plusieurs essaie de
définition de variable dans le controlleur, je sèche

as-tu essayé avec autre chose que le mot ‘type’ ? je me demande si ce
n’est pas un mot réservé…

gUI

as-tu essayé avec autre chose que le mot ‘type’ ? je me demande si ce
n’est pas un mot réservé…

Je confirme, j’ai déjà eu des ennuis en utilisant “type”.

C’est en effêt une méthode d’Object, même si son usage est “deprecated”

irb(main):002:0> ‘toto’.type
(irb):2: warning: Object#type is deprecated; use Object#class
=> String


IciMarché fédère l’e-commerce de proximité
http://icimarche.fr

2010/3/15 philippe lachaise [email protected]:

C’est un mot clé réservé et utilisé par ActiveRecord pour gérer la STI.


http://fabien.jakimowicz.com

Bon le problème ne venait pas que j’avais choisi un nom proche d’un mot
réservé.

La variable @depenses n’a plus accès à la table Type

J’ai résolu le problème ne fessant un Hash de ma table Type

def index
@depenses = Depense.all

@types = Hash.new
@types = Hash[*Type.all.map { |u| [u.id, u.name] }.flatten]

respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @depenses }
end
end

et dans ma vue

<% if depense.type_id != nil %>
<%=h @types[depense.type_id] %>
<%end %>

Le 15 mars 2010 11:55, Fabien J. [email protected] a écrit
:

=> String

C’est un mot clé réservé et utilisé par ActiveRecord pour gérer la STI.

pour info, la liste complète des mots clés réservés :
http://wiki.rubyonrails.org/rails/pages/reservedwords

Bonsoir.

Je suis vraiment perplexe là… Tout le monde te dit de renommer cette
variable autrement que Type. Et c’est exactement cela le problème.
Tout ton code de contrôleur avec l’initialisation de la variable
@types ainsi que ton code de vue ne sert a rien.
Ne tente pas de réinventer la roue, si quelque chose ne fonctionne pas
simplement c’est que sûrement tu t’y prends mal.
Si t’as un objet Bar qui a un attribut name, et un objet Foo qui a
belongs_to :bar, tu dois pouvoir écrire directement dans ta vue
@foo.bar.name et c’est tout.
Et enfin si ton objet Depense est rattaché à plusieurs types de
dépense, c’est pas du belongs_to mais sûrement du
has_and_belongs_to_many et dans ce cas : RTFM sur
http://api.rubyonrails.org

@+. Nicolas.

2010/3/15 Denis H. [email protected]:

Nicolas B. wrote:

Bonsoir.

Je suis vraiment perplexe l�… Tout le monde te dit de renommer cette
variable autrement que Type. Et c’est exactement cela le probl�me.
Tout ton code de contr�leur avec l’initialisation de la variable
@types ainsi que ton code de vue ne sert a rien.
Ne tente pas de r�inventer la roue, si quelque chose ne fonctionne pas
simplement c’est que s�rement tu t’y prends mal.
Si t’as un objet Bar qui a un attribut name, et un objet Foo qui a
belongs_to :bar, tu dois pouvoir �crire directement dans ta vue
@foo.bar.name et c’est tout.
Et enfin si ton objet Depense est rattach� � plusieurs types de
d�pense, c’est pas du belongs_to mais s�rement du
has_and_belongs_to_many et dans ce cas : RTFM sur
http://api.rubyonrails.org

@+. Nicolas.

2010/3/15 Denis H. [email protected]:

Bonjour,

J’ai fait le test avec la table account, et j’ai eu le même problème
quand je défini @depenses = Depense.all (testé dans la console avec la
table accounts)
@depenses ne permet pas d’avoir access à types.

Bon c’est sûr types pour la DB n’était pas un bon choix

Bonsoir,

ce que je cherche, ce n’est pas de reprendre tout les objets types, mais
d’afficher dans ma vue de toutes mes depenses avec types.name et lieu de
depenses.type_id.


J'ai fait le test avec la table account, et j'ai eu le même problème quand je défini @depenses = Depense.all (testé dans la console avec la table accounts)
@depenses ne permet pas d'avoir access à types.
je pense que je (on) avais mal compris ton besoin. c'est de choper l'ensemble des types des dépenses ?

dans ce cas je ferais qqchose comme (là je parle sous le controle de la liste j'ai pas de Ruby sous la main, j'ai assez de pb psychomoteurs avec les différents types énumérés):

Depenses.all.each do |dep|
@liste_types << dep.type
end

mais en effet, Active Record ne possède pas de raccourcis pour à partir d'un énuméré te donner un autre énuméré 'fils' ou (père ou frère ou soeur oh oh ce serait le bonheur).

gUI



Vous avez reçu ce message, car vous êtes abonné au groupe
"Railsfrance" de Google G…

Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
[email protected]

Pour résilier votre abonnement envoyez un e-mail à l'adresse
[email protected]

Bon en faite
@depenses = Depense.all
@depense.type.name

Ca marche quand il y un un type associé aux depense, sinon @depense.type
= nil et
@depense.type.name renvoie une erreur

Bon en faite

@depenses = Depense.all
@depense.type.name

j’avoue etre un peu perdu dans tes singuliers et tes pluriels. tu as
ecris
plusieurs fois que tu cherchais à faire @depenses.types par exemple, ça
n’a
rien à voir avec @depense.type !

gUI


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

Guillaume B. wrote:

Bon en faite

@depenses = Depense.all
@depense.type.name

j’avoue etre un peu perdu dans tes singuliers et tes pluriels. tu as
ecris
plusieurs fois que tu cherchais à faire @depenses.types par exemple, ça
n’a
rien à voir avec @depense.type !

gUI


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

Désole, @depenses.types n’existe pas, seul @depense.type donne quelques
chose, à ne pas confondre avec la class Type qui est définie dans le
module pour la gestion de la table types

Nicolas B. wrote:

Yo.

Tu as une relation belongs_to :type dans ton objet d�pense, cela veut
dire que la relation est sur depense.type et non pas depense.types. Si
une d�pense a un seul type, c’est du belongs_to et la relation est au
singulier, sinon c’est du has_many ou has_and_belongs_to_many avec une
table de relation interm�diaire, et l� effectivement le nom de la
relation est au pluriel !

Si dans ta vue tu veux afficher le nom du type de ta d�pense et tu
n’es pas sur que celui ci est d�fini a chaque fois (il est peut �tre
nil sur certains enregistrements), tu peux t’amuser � tester que
depense � un type avec un bloc if ou encore faire des choses plus
rapides du style :
<%= depense.type.try(:name) || “N.C.” %> (qui affichera N.C. si
depense n’a pas de type) ou encore mieux utiliser la m�thode delegate
dans ton mod�le (regarde la doc de Rails) et dans ce cas �crire dans
ta vue <%= depense.type_name || “N.C.” %>.

De plus, �coute nous et renomme rapidement ta relation/mod�le en autre
chose que Type/type ! Tout le monde te dit que type est un mot cl�
r�serv� dans Rails, donc si t’as pas de probl�me maintenant t’en auras
forc�ment plus tard et tu risques de te mordre les doigts apr�s des
heures � rechercher pourquoi.

Nicolas.

2010/3/16 Denis H. [email protected]:

la relation est bien delongs_to, une depense à 0 ou 1 type associé

j’avais résolu le problème du nil en testant dans le controleur la
valeur

if @depense.type == nil
  @type_render = " "
else
  @type_render = @depense.type.name
end

<%= depense.type.try(:name) || “N.C.” %> marche nickel, c’est plus
propre que de définir une variable.
Je vais regarder aussi la la methode delegate

Entre temps j’ai recreé la table types => genders et en même temps le
champs name en designation, parce que name pausse aussi des problèmes.

Merci de vos réponses.

Yo.

Tu as une relation belongs_to :type dans ton objet dépense, cela veut
dire que la relation est sur depense.type et non pas depense.types. Si
une dépense a un seul type, c’est du belongs_to et la relation est au
singulier, sinon c’est du has_many ou has_and_belongs_to_many avec une
table de relation intermédiaire, et là effectivement le nom de la
relation est au pluriel !

Si dans ta vue tu veux afficher le nom du type de ta dépense et tu
n’es pas sur que celui ci est défini a chaque fois (il est peut être
nil sur certains enregistrements), tu peux t’amuser à tester que
depense à un type avec un bloc if ou encore faire des choses plus
rapides du style :
<%= depense.type.try(:name) || “N.C.” %> (qui affichera N.C. si
depense n’a pas de type) ou encore mieux utiliser la méthode delegate
dans ton modèle (regarde la doc de Rails) et dans ce cas écrire dans
ta vue <%= depense.type_name || “N.C.” %>.

De plus, écoute nous et renomme rapidement ta relation/modèle en autre
chose que Type/type ! Tout le monde te dit que type est un mot clé
réservé dans Rails, donc si t’as pas de problème maintenant t’en auras
forcément plus tard et tu risques de te mordre les doigts après des
heures à rechercher pourquoi.

Nicolas.

2010/3/16 Denis H. [email protected]: