我有2个模型Auteur
和Biblio
彼此have_and_belongs_to_many
。
在显示作者(auteur)及其书籍(biblio)的模板中,我有以下代码:
<% @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 %>
由于每个biblio有8个字段,并且根据其发布形式和内容类型可以属于不同类型,这将导致在erb中执行大量map
和if
语句。
虽然这很好,但必须有更好的方法。
由于
答案 0 :(得分:1)
您可以将此代码作为Author
模型
def biblios_titre
biblios.map(&:titre).join(', ')
end
def biblios_lieu
biblios.map(&:lieu).join(', ')
end
def biblios_annee
biblios.map(&:annee).join(', ')
end
在视图中使用它
<% @auteurs.each do |e| %>
<p><%= e.nom_complet %>,
<i><%= e.biblios_titre %></i>,
<%= e.biblios_lieu %>,
<%= e.biblios_annee %>
</p>
<% end %>
答案 1 :(得分:0)
您可以在模型中创建辅助方法。
def view_biblios
self.nom_complet << "<i>" <<
self.biblios.map(&:titre).join ", " <<
"</i>, " << self.biblios.map(&:lieu).join ", " <<
", " << self.biblios.map(&:annee).join ", "
end
在视图中
<%= e.view_biblios.html_safe %>
<强>更新强>
由于您可能希望根据评论将标题保持在一起,因此您可能需要使用此方法
def view_biblios
self.nom_complet << self.biblios.map{|b|
"<i>#{b.titre}</i>, #{b.lieu}, #{b.annee}"}.join ", "
end
答案 2 :(得分:0)
感谢所有答案。最后我这样做了。使用each
就足够了。下面的代码也有一点css,标题显示在每个作者下面缩进(粗体)。
在让我的8个模型正确通信后,我会完成所有代码清理工作并将工件移动到帮助程序:)
<% @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 %>