1

ログインしているユーザーが管理者である場合、編集ボタンと追加情報を表示する本のリストがあります。現在、ログインしているユーザーのタイプに応じてレンダリングされる 2 つの個別のパーシャルがあります。ステートメントですが、それは本当に醜くなり始めました。今、私は 2 つのファイルをジャグリングしており、それぞれに少しの重複データがあります。これを行うより良い方法はありますか?

index.html.erb

<ul>
  <% if @current_user.admin? %>
    <%= render :partial => "book", :collection => @books %>
  <% else %>
    <%= render :partial => "non_admin_book", :collection => @books %>
  <% end %>
</ul>

_book.html.erb

Title: <%= book.title %> EDIT BUTTON
<!-- Awesome extra info for admins -->
Author: <%= book.author %>
<!-- Awesome extra info for admins -->

_non_adminbook.html.erb

Title: <%= book.title %>
Author: <%= book.author %>   
4

4 に答える 4

3

この質問は次のようなものです:1つのパーシャル/ビュー全体でI18nキーのみを使用する必要がありますか、それとも各言語にXビュー/パーシャルを使用する必要がありますか?

良い解決策も悪い解決策もありません。私の意見では、adminの場合は<%などの条件を使用することから始める必要がありますか?%> blah blah <%end%>..。

次に、管理者ビューが非管理者ビューと大きく異なる場合は、条件を削除して、my_view/my_view_adminの2つのビューを作成します。

于 2010-11-04T00:40:07.857 に答える
2

#192CanCanによる承認 このカンカンの宝石はあなたを助けるかもしれません

于 2011-12-03T07:01:17.773 に答える
2

私はどんな種類の複製も本当に好きではありませんが、時にはそれが最も簡単な解決策です.

あなたの場合、私はそれを言うことができます

  • 管理者には、フィールドを編集するオプションがあります (インライン?)
  • 管理者にはより多くのフィールドが表示されます

通常、インライン編集にはon_the_spot gem を使用し、次のようなヘルパーを使用します。

def on_the_spot_edit_if_allowed(object, field, options)
  if current_user.admin?
    on_the_spot_edit object, field, options
  else
    object.send(field)
  end
end

その場合、私の見解は次のようになります

Title: <%= on_the_spot_edit_if_allowed book, title %>
<%- if current_user.admin? %>
  <!-- Awesome extra info for admins -->
<% end %>
Author: <%= book.author %>
<%- if current_user.admin? %>
  <!-- Awesome extra info for admins -->
<% end %>

それ以外の場合 (デザイン/UI の制約) が不可能でない限り、そのビューを次のようにリファクタリングします。

Title: <%= on_the_spot_edit_if_allowed book, title %>
Author: <%= book.author %>
<%- if current_user.admin? %>
  <%= render :partial => 'extra_admin_fields'
<% end %>

お役に立てれば。

于 2011-12-05T09:29:50.270 に答える
1

そのままにしておいてください。

あなたの重複はそれほど大きくありません。

@current_user.admin?条件は、ソリューションで 1 回だけ実行されます。

@current_user.admin?共有パーシャルを入れると、このコレクションのすべてのメンバーに対して実行されます。クールではありません。

于 2011-12-06T19:07:51.927 に答える