我有多个模型,他们的索引视图几乎共享完全相同的代码和布局。
... /巧克力/ 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
。
我想过使用布局但它给我留下了很大的代码块,与其他索引视图非常相似。
我与你分享了我的尝试,问题是......
答案 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"%>
或者添加一些东西可以让你识别哪个是源....