0

ほぼ同じ情報をレンダリングする非常によく似たビューのペアがあります。一方のビューにはいくつかの追加の列があり、もう一方のビューでは行がわずかに異なるネストされたリソースにリンクしています。私の最初のアプローチは、パーシャルを使用してビュー全体に条件を配置することにより、DRYを維持することでした。結果のパーシャルは次のようになります。

<div id='overview_table'>
  <div id="overview_header">
    <span id="sort_title" class="title cell">Title<span id="publication_sort_arrow"> &darr;</span></span>
    <span id="sort_author" class="author cell">Author</span>
    <span id="sort_status" class="status cell">Status</span>
    <% if @user.present? %>
        <span id="sort_impression_date" class="date cell">Date</span>
        <span id="sort_impression_vote" class="votes cell">Votes</span>
        <span id="sort_children_total" class="children_total cell">Replies</span>
    <% end %>
  </div>
  <span id="sort_method">title ASC</span>
  <% @publications.each do |publication| %>
    <div class='<%= cycle("odd", "even") %>'>
        <% if @user.present? %>
            <% link = [@user, publication] %>
        <% else %>
          <% link = [@group, publication] %>
        <% end %>
        <%= link_to(link, :remote => true) do %>
            <span class="title cell"><%= publication.full_title %></span>
            <span class="author cell"><%= publication.authors %></span>
            <span class="status cell"><%= publication_status(publication.status) %></span>
            <% if @user.present? %>
                <span class="date cell"><% if publication.impression_date %><%= publication.impression_date.strftime("%B %d, %Y") %><% end %></span>
                <span class="votes cell"><% if publication.impression_vote %><%= publication.impression_vote.to_i %><% end %></span>
                <span class="children_total cell"><% if publication.impression_vote %><%= publication.children_total %><% end %></span>
            <% end %>
        <% end %>
    </div>
<% end %>

それはうまくいきましたが、コードはハッキーだと感じました。私は最終的にこれらを2つの異なるビューに分離しましたが、今ではコードが繰り返されています。どちらのアプローチも不十分だと感じています。私が検討していない別のアプローチはありますか?

4

1 に答える 1

0

ここにはさまざまな戦略がありますが、この場合、いくつかのフィールドを追加するだけであれば、私はこのようなことをします(これはあなたがしていることと似ています)。

私のコントローラーでは、いくつかのタグ値をtrueに設定します。

@show_val_extra=true 

そして私の見解では(おそらくあなたの例ではインラインコードではなく部分的なものです):

  <%="something here" unless @show_val_extra.nil? %>

何をチェックする必要があるかに関係なく、コントローラーでビューを管理する他の問題は私には醜いです。YMMVですが、これは基本的に単一の値になり、異なる情報が必要な場合に単一のチェックを行うため、私が行うことです。通常、それは複数の場所にありますが、複数の場所にコンテンツがあり、状況が発生した場合はさらにリファクタリングするのは簡単です。

于 2013-01-11T14:02:38.733 に答える