Forum: Rails France Afficher un enfant dans une vue

17c411e61212a9a5b6b323288e2bbbbd?d=identicon&s=25 Denis Helix (helix_tp)
on 2010-03-15 16:21
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

<h1>Listing depenses</h1>

<table>
  <tr>
    <th>Datedepense</th>
    <th>Credit</th>
    <th>Debit</th>
    <th>Id account</th>
    <th>Id type</th>
    <th>description</th>
    <th>code</th>
  </tr>

<% @depenses.each do |depense| %>
  <tr>
    <td><%=h depense.datedepense %></td>
    <td><%=h depense.credit %></td>
    <td><%=h depense.debit %></td>
    <td><%=h depense.account_id %></td>
    <td><%=h depense.type_id %></td>
    <td><%=h depense.description %></td>
    <td><%=h depense.code %></td>
    <td><%= link_to 'Show', depense %></td>
    <td><%= link_to 'Edit', edit_depense_path(depense) %></td>
    <td><%= link_to 'Destroy', depense, :confirm => 'Are you sure?',
:method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= 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
98d4d4be867fc17d3120f683513d3819?d=identicon&s=25 Guillaume Betous (Guest)
on 2010-03-15 16:27
(Received via mailing list)
> 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
64cefc5969da4ae702d86c9f26cb8733?d=identicon&s=25 philippe lachaise (Guest)
on 2010-03-15 17:44
(Received via mailing list)
>> 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
Be1e3ee645d23c95ba650c21bc885927?d=identicon&s=25 Fabien Jakimowicz (Guest)
on 2010-03-15 17:57
(Received via mailing list)
2010/3/15 philippe lachaise <philippe.lachaise@gmail.com>:
>
C'est un mot clé réservé et utilisé par ActiveRecord pour gérer la STI.

--
http://fabien.jakimowicz.com
Ad6ce40f9aa3fb8817b7299baf0f8484?d=identicon&s=25 Florent Florent (Guest)
on 2010-03-15 19:14
(Received via mailing list)
Le 15 mars 2010 11:55, Fabien Jakimowicz <fabien@jakimowicz.com> 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
17c411e61212a9a5b6b323288e2bbbbd?d=identicon&s=25 Denis Helix (helix_tp)
on 2010-03-15 21:21
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
.....
    <td><% if depense.type_id != nil %>
      <%=h @types[depense.type_id]  %>
    <%end %>
    </td>
......
8458ed8e78b2660f8b839f052e20f65f?d=identicon&s=25 Nicolas Blanco (slainer68)
on 2010-03-15 23:11
(Received via mailing list)
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 Helix <list-incoming@andreas-s.net>:
17c411e61212a9a5b6b323288e2bbbbd?d=identicon&s=25 Denis Helix (helix_tp)
on 2010-03-16 10:41
Nicolas Blanco 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 Helix <list-incoming@andreas-s.net>:

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
98d4d4be867fc17d3120f683513d3819?d=identicon&s=25 Guillaume Betous (Guest)
on 2010-03-16 11:23
(Received via mailing list)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
<blockquote type="cite">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)
  <br>
@depenses ne permet pas d'avoir access à types.
  <br>
  </blockquote>
je pense que je (on) avais mal compris ton besoin. c'est de choper
l'ensemble des types des dépenses ?
<br>
<br>
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):
<br>
<br>
Depenses.all.each do <code class="moz-txt-verticalline"><span
 class="moz-txt-tag">|</span>dep<span
class="moz-txt-tag">|</span></code>
<br>
 @liste_types &lt;&lt; dep.type
<br>
end
<br>
<br>
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).
<br>
<br>
gUI
<br>
</body>
</html>

<p></p>

-- <br />
Vous avez reçu ce message, car vous êtes abonné au groupe
&quot;Railsfrance&quot; de Google Groups.<br />
Pour transmettre des messages à ce groupe, envoyez un e-mail à l&#39;adresse
railsfrance@googlegroups.com<br />
Pour résilier votre abonnement envoyez un e-mail à l&#39;adresse
railsfrance-unsubscribe@googlegroups.com
17c411e61212a9a5b6b323288e2bbbbd?d=identicon&s=25 Denis Helix (helix_tp)
on 2010-03-16 22:05
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.
17c411e61212a9a5b6b323288e2bbbbd?d=identicon&s=25 Denis Helix (helix_tp)
on 2010-03-16 23:02
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
98d4d4be867fc17d3120f683513d3819?d=identicon&s=25 Guillaume Betous (Guest)
on 2010-03-16 23:38
(Received via mailing list)
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/
8458ed8e78b2660f8b839f052e20f65f?d=identicon&s=25 Nicolas Blanco (slainer68)
on 2010-03-16 23:50
(Received via mailing list)
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 Helix <list-incoming@andreas-s.net>:
17c411e61212a9a5b6b323288e2bbbbd?d=identicon&s=25 Denis Helix (helix_tp)
on 2010-03-17 06:21
Guillaume Betous 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
17c411e61212a9a5b6b323288e2bbbbd?d=identicon&s=25 Denis Helix (helix_tp)
on 2010-03-17 06:34
Nicolas Blanco 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 Helix <list-incoming@andreas-s.net>:

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.
This topic is locked and can not be replied to.