如何与多个模型共享相同的视图?

时间:2016-09-18 17:30:40

标签: ruby-on-rails ruby-on-rails-4 erb

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

... /巧克力/ 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代码的好习惯吗?如果没有,当这些模型几乎共享完全相同的代码和布局时,与多个模型共享相同视图代码的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试model_name

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

或更好

  <% 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。所以从model_name拨打active_model并不会给那里带来很多帮助。如果你看部分的导轨指南,你会看到render @collection。这基本上只是对集合中每个对象进行迭代,为您查看model_name,并将其传递给相应的部分以进行渲染。

因此,如果您有一个@sweets的集合,其中包含一堆Sweet个对象,则rails将迭代该集合。然后为您呈现_sweet.html.erb(遵循定位哪个部分的常规规则)。有了这个,您可以将<% dist.each do |sing| %>块调整为<%=render dist%>,然后确保每个模型都有一个部分,它可以以不同的方式呈现它们

答案 1 :(得分:0)

一个简单的解决方案是使用包含class_name作为参数的部分

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

或者添加一些东西可以让你识别哪个是源....

相关问题