我可以将此代码从erb移动到模型吗?

时间:2016-12-25 10:35:19

标签: ruby-on-rails erb

我有2个模型AuteurBiblio彼此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中执行大量mapif语句。

虽然这很好,但必须有更好的方法。

由于

3 个答案:

答案 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 %>