2016-09-18 219 views
0

我有多个模型,他们的索引视图几乎共享完全相同的代码和布局。如何与多个模型共享相同的视图?

... /巧克力/ index.html.erb

<h1 class="col-sm-12 head">Index Bases</h1> 
<hr> 
<% @chocolates.each do |chocolate| %> 

    <%= link_to chocolate do %> 
    <%= set_img(chocolate) %> 
    <% end %> 

    <ul> 
    <li><%= chocolate.name %></li> 
    <li><%= chocolate.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to chocolate do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 
    <%= link_to edit_chocolate_path(chocolate) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 
    <%= link_to basis, method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 

<% end %> 
<hr> 
<%= link_to '+ Add New Chocolate', new_chocolate_path %> 

... /糕点/ index.html.erb

<h1 class="col-sm-12 head">Index Bases</h1> 
<hr> 
<% @sweets.each do |sweet| %> 

    <%= link_to sweet do %> 
    <%= set_img(sweet) %> 
    <% end %> 

    <ul> 
    <li><%= sweet.name %></li> 
    <li><%= sweet.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to sweet do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 
    <%= link_to edit_sweet_path(sweet) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 
    <%= link_to sweet, method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 

<% end %> 
<hr> 
<%= link_to '+ Add New Sweet', new_sweet_path %> 

还有更多的模式,共享相同的布局,我认为我不断重复我的自我,所以我创建了一个共享部分,并在每个使用该布局的视图中呈现变量。

... /糕点/ index.html.erb

<% render 'shared/indexGrid', dist: @sweets%> 

... /视图/共享/ _indexGrid.html.erb

<% title = dist.class.name.underscore.tr('_', ' ').pluralize.split.map(&:capitalize).join(' ') %> 
<% sing = dist.class.name.underscore %> 

<h1>Index <% title %></h1> 
<hr> 

<% dist.each do |sing| %> 

    <%= link_to sing do %> 
    <%= set_img(sing) %> 
    <% end %> 

    <ul> 
    <li><%= sing.name %></li> 
    <li><%= sing.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to sing do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 

    <%= link_to send("edit_#{sing.class.name.underscore}_path", sing) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 

    <%= link_to sing, class: 'square red', method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 
<% end %> 
<hr> 
<%= link_to "+ Add New #{title}", send("new_#{sing.class.name.underscore}_path"), { class: 'btn btn-success btn-block'} %> 

,但它没”吨似乎工作,因为 - 我认为 - dist.class.name deasnt返回我期待的价值,但返回"active_record/relation"。 我已经尝试过与编辑视图相同的方法,它与dist: @sweet

我曾经想过使用布局,但它给我留下了与其他索引视图非常相似的大块代码。

我分享我尝试用你的时候,这个问题......

  • 这有什么错我的代码,以及如何解决它?
  • 该方法是否被认为是DRY代码的良好实践?如果不是的话当这些模型几乎共享完全相同的代码和布局时,与多个模型共享相同视图代码的最佳方式是什么?

回答

1

你可以尝试model_name

<% title = dist.model_name.to_s.underscore.tr('_', ' ').pluralize.split.map(&:capitalize).join(' ') %> 

or better better

<% title = dist.model_name.human.pluralize.titleize %> 

也应该给你你想要的。

和清理的路线,你可以看看PolymorphicRoutes

http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html

所以不是

link_to send("edit_#{sing.class.name.underscore}_path", sing) 

,你可以使用类似

link_to 'Edit, edit_polymorphic_path(sing) 

这应该清理很好地分享你的共享索引页面。

你也可以看看创建一个title_for(例如)助手,它返回标题。清理它,但不是100%需要。

- 第2部分 -

这是一个好主意吗?也许?那是不是答案。有很多因素。所有这些模型总是完全一样的可能性有多大?稍后再做一个不同的工作会有多难?如果我有一堆模型基本相同,总是会有相同的索引页面,我可能会考虑做类似的事情。自动生成视图等的引擎/宝石/插件使用了同样的想法。所以我猜如果他们总是会一样的,而且你总是希望保持它看起来一样,那么像这样的事情是完全没问题的。

对于看起来像@sweets之类的部分集合,它不是您的模型的单个实例。这可能是一个ActiveRelation。所以从active_model调用model_name在这里不会有太大的帮助。如果你看部分的导轨指南,你会看到render @collection。这基本上只是对集合中的每个对象进行迭代,为您查看model_name,并将其传递给其相应的局部渲染。

所以如果你有一个@sweets的集合,其中有一堆Sweet对象,轨道将迭代集合。然后渲染_sweet.html.erb(遵循寻找哪个部分的常规规则)。有了这个,你可以调整你的<% dist.each do |sing| %>块为<%=render dist%>,然后只是确保每个模型有一个局部的,它可以使他们都有所不同

+0

感谢男人的伟大答案,现在工作得很好,但我的第二部分问题仍然没有答案,那么你认为这是做这种事情的最好方法吗?你认为在模型之间分享观点是正确的 - 性能明智的或如此。我在查看'Partial'文档,并且发现了一些名为'collection'的东西,我怀疑这与这种情况有关。还有,当我运行'@ sweets.model_name'时,它返回了一个包含很多值的散列,如命名的路径和其他实例变量我也怀疑它可以帮助。 –

+0

增加了一些更多的信息,这将有助于... – Doon

+0

谢谢你的男人,最后一段很有帮助 –

0

一个简单的解决方案是使用谐音包括class_name作为参数

<% render 'shared/indexGrid', dist: @sweets, class_name = "Sweets"%> 

或添加什么东西可以让你认识到这是源....

相关问题