我有两个具有相似输出但有重大变化的部分。
部分1
<h2 class="text-center">Current Incident</h2>
<% active_incidents.each do |i| %>
<div class="incident-block">
<p class="incident-date"><span class="inner-date"><%= i.updated_at.strftime('%e %b, %Y') %></span></p>
<span class="incident-name text-<%= i.convert_to_level %>"><%= i.name %>
<% if signed_in? %><a href="/incidents/deactivate/<%= i.id %>">
<button class="btn btn-success deactivate-button btn-xs">Deactivate incident</button>
</a>
<% end %></span>
<span class="incident-component text-<%= i.convert_to_level %>"><%= i.component %></span>
<% all_events(i).each do |e| %>
<hr class="event-hr"/>
<p class="incident-description"><b><%= e.status %></b>- <%= e.message %></p>
<p class="incident-updated-at"><%= e.updated_at.strftime('%b %e, %H:%M %Z') %></p>
<% end %>
<% if signed_in? %>
<a href="/incidents/<%= i.id %>">
<button class="btn btn-warning btn-sm">Update Incident</button>
</a>
<a href="/incidents/delete/<%= i.id %>" data-confirm="Are you sure? Deleting an incident is irreversible.">
<button class="btn btn-danger btn-sm">Delete Incident</button>
</a>
<% end %>
</div>
<% end %>
Partial 2
<% if inactive_incidents.any? %><h2 class="text-center">Past Incidents</h2><% end %>
<% inactive_incidents.each do |i| %>
<div class="incident-block">
<p class="incident-date"><span class="inner-date"><%= i.updated_at.strftime('%e %b, %Y') %></span></p>
<span class="incident-name text-<%= i.convert_to_level %>"><%= i.name %></span><span class="incident-component text-<%= i.convert_to_level %>"><%= i.component %></span>
<% all_events(i).each do |e| %>
<hr class="event-hr"/>
<p class="incident-description"><b><%= e.status %></b>- <%= e.message %></p>
<p class="incident-updated-at"><%= e.updated_at.strftime('%b %e, %H:%M %Z') %></p>
<% end %>
<% if signed_in? %>
<a href="/incidents/<%= i.id %>">
<button class="btn btn-warning btn-sm">Update Incident</button>
</a>
<a href="/incidents/delete/<%= i.id %>" data-confirm="Are you sure? Deleting an incident is irreversible.">
<button class="btn btn-danger btn-sm">Delete Incident</button>
</a>
<% end %>
</div>
<% end %>
现在,这些部分包含类似的代码,但是有重大更改会产生不同的输出。因为代码可维护性现在成为我的问题(我必须做两次所有更改)。如何干掉代码但仍然保持不同的逻辑?
答案 0 :(得分:0)
为每个人创建一个模板。然后在中间使用您的公共代码并将其部分放入。从每个模板中调用partial,并将事件作为局部变量发送。就像在模板中一样:
<%= render partial: 'incidents', locals: { incidents: inactive_incidents } %>
您甚至可以使用集合为每个事件调用部分内容。
此外,如果您在公共部分内部的逻辑不同,您可以使用帮助程序根据传递的局部变量或其他来切换该逻辑。利用这个,也许content_tag应该有所帮助。
我建议您阅读指南:http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials