Rails - 干掉类似的观点

时间:2015-09-27 13:33:08

标签: ruby-on-rails

我有两个具有相似输出但有重大变化的部分。

  • 部分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>- &nbsp;<%= 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>- &nbsp;<%= 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 %>
    

现在,这些部分包含类似的代码,但是有重大更改会产生不同的输出。因为代码可维护性现在成为我的问题(我必须做两次所有更改)。如何干掉代码但仍然保持不同的逻辑?

1 个答案:

答案 0 :(得分:0)

为每个人创建一个模板。然后在中间使用您的公共代码并将其部分放入。从每个模板中调用partial,并将事件作为局部变量发送。就像在模板中一样:

<%= render partial: 'incidents', locals: { incidents: inactive_incidents } %>

您甚至可以使用集合为每个事件调用部分内容。

此外,如果您在公共部分内部的逻辑不同,您可以使用帮助程序根据传递的局部变量或其他来切换该逻辑。利用这个,也许content_tag应该有所帮助。

我建议您阅读指南:http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials