2016-12-25 4 views
0

Ich habe 2 Modelle Auteur und Biblio, die beide have_and_belongs_to_many voneinander haben.Kann ich diesen Code von erb auf das Modell übertragen?

In der Vorlage der Autoren (auteur) und seine Bücher (biblio) angezeigt wird, habe ich diesen Code:

<% @auteurs.each do |e| %> 
<p><%= e.nom_complet %>, <i> <%= e.biblios.map{|l| l.titre }.join(', ') %></i>, <%= e.biblios.map { |l| l.lieu }.join(', ') %>, <%= e.biblios.map { |l| l.annee }.join(', ') %> 
</p> 
<% end %> 

Da jeder biblio 8 Felder hat und auf verschiedene Arten entsprechend seiner Form der Veröffentlichung gehören kann und Art des Inhalts, dies würde zu einer Menge von map und if Aussagen in Erb führen.

Obwohl dies gut funktioniert, muss es einen besseren Weg geben, dies zu tun.

Dank

+0

Sie meine 'has_and_belongs_to_many' richtig? –

+0

Anstelle des Modells können Sie es zum Helfer –

+1

oder zum Vorführer bewegen. – marmeladze

Antwort

1

Sie können diesen Code als Instanzmethoden bewegen in Author Modell

def biblios_titre 
    biblios.map(&:titre).join(', ') 
end 

def biblios_lieu 
    biblios.map(&:lieu).join(', ') 
end 

def biblios_annee 
    biblios.map(&:annee).join(', ') 
end 

Und in Aussicht

<% @auteurs.each do |e| %> 
    <p><%= e.nom_complet %>, 
    <i><%= e.biblios_titre %></i>, 
    <%= e.biblios_lieu %>, 
    <%= e.biblios_annee %> 
    </p> 
<% end %> 
+0

Wenn ich das tue, dann werden Titel, Jahr und Ort deutlich gemappt, was zu Titeltittitel, titletwittitel, titlethreetitle, Paris, New York, Moskau, 1965, 2014, 2012'' – thiebo

+0

@thiebo führt, Ihr Kommentar ändert ein bisschen Ihre Frage . Bitte überprüfen Sie meine aktualisierte Antwort unten. –

0

verwenden Sie eine Hilfsmethode im Modell erstellen können.

def view_biblios 
    self.nom_complet << "<i>" << 
      self.biblios.map(&:titre).join ", " << 
      "</i>, " << self.biblios.map(&:lieu).join ", " << 
      ", " << self.biblios.map(&:annee).join ", " 
end 

Und in der Ansicht

<%= e.view_biblios.html_safe %> 

UPDATE

Da Sie wahrscheinlich zusammen, auf Ihrem Kommentar basierend Titel behalten möchten, können Sie diese Methode anstelle

def view_biblios 
    self.nom_complet << self.biblios.map{|b| 
     "<i>#{b.titre}</i>, #{b.lieu}, #{b.annee}"}.join ", " 
end 
benötigen
+0

Toll, danke Ruby Racer! Das ist ziemlich genau das, was ich getan habe. (Ich habe nur 4 Credits, da ich mich kürzlich bei SO registriert habe, also kann ich dich nicht aufrüsten). Wenn ich kann, werde ich unten posten, wie ich das schließlich gemacht habe. – thiebo

0

Danke für alle Antworten. Am Ende habe ich es so gemacht. Die Verwendung von each war ausreichend. Der Code unten hat auch ein bisschen CSS, die Titel erscheinen eingerückt unter jedem Autor (fett gedruckt).

Ich werde alles tun, die Reinigung des Codes und beweglichen Teile auf Helfer, nachdem ich meine 8 Modelle erhalten richtig zu kommunizieren :)

<% @auteurs.each do |e| %> 
<p><strong><%= e.nom_complet %></strong> 

<% e.biblios.each do |l| %> 
    <br><span id="indent"><i><%= l.titre %></i>, <%= l.lieu %>, <%= l.annee.to_s %></span> 

    <% end %> 
</p> 
<% end %>