2015-09-27 70 views
0

我有两个部分有相似的输出,但主要变化。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 %> 
    
  • 部分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 %> 
    

现在,这些谐音家类似的代码,但与渲染不同的输出显著的变化。由于代码可维护性现在成为我的问题(我必须做两次所有更改)。我如何干掉代码但仍保持不同的逻辑?

+0

万一有人需要更多的情况下,[这里的源(https://github.com/ur0/statusify)。 –

回答

0

对于每一个,创建一个模板。然后把你的通用代码放在中间,并把它放在一个部分。从每个模板中调用partial并将事件作为局部变量发送。像这样在模板中:

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

你甚至可以称之为局部使用集合中的每个事件。

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

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