Forum: Rails France Afficher un enfant dans une vue

Posted by 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
Posted by 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
Posted by 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
Posted by 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
Posted by 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
Posted by 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>
......
Posted by 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>:
Posted by 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
Posted by 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
Posted by 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.
Posted by 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
Posted by 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/
Posted by 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>:
Posted by 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
Posted by 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.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.