2010-11-03 58 views
1

我有一個書籍列表顯示編輯按鈕和一堆額外的信息,如果用戶登錄是管理員。現在我有兩個單獨的部分,根據用戶登錄的類型來呈現。我曾經只有一個部分,如果user.admin有一堆?聲明,但它開始變得真醜。現在我正忙着圍繞兩個文件,每個文件都有一些重複的數據。有沒有更好的方法來做到這一點?幫我重構我的管理員用戶的意見與非管理員用戶的意見

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 %> 

回答

3

這個問題是這樣的:我應該只使用的I18n鍵遍佈一個部分/視圖,還是應該爲每種語言使用X視圖/部分?

沒有好的或壞的解決方案。我的意見是,你應該開始使用條件,如<%,如果管理員?然後,如果您的管理視圖與非管理視圖大不相同,請刪除條件並創建兩個視圖:my_view/my_view_admin。如果您的管理視圖與非管理視圖大不相同,請刪除條件並創建兩個視圖:my_view/my_view_admin。

2

我真的不喜歡任何形式的複製,但有時這是最簡單的解決方案。

在你的情況,我可以告訴大家,

  • 管理員有權編輯字段選項(內嵌?)
  • 管理員看到更多的領域

一般我用的是on_the_spot寶石對於內聯編輯,然後我與這樣的幫手一起工作:

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 %> 

希望這有助於。

1

保持它的樣子。

您的重複數量並不大。

@current_user.admin?條件將只在您的解決方案中運行一次。

如果您將@current_user.admin?放在共享的部分,它將運行此集合的每個成員。不酷。

相關問題