2013-09-01 30 views
1

在我的Rails應用程序中,我有幾個控制器爲我的客戶組成了一個站點。最終用戶和管理員幾乎可以使用所有的控制器。哪裏是在Rails中存儲佈局邏輯的最佳地點?

我創建了一個包含導航鏈接的部分。我的問題是我不希望它們出現在管理部分的內部。使這個棘手的部分是,雖然導航應該出現在像pages/home,/galleries/galleries/5之類的東西,但他們不應該出現在像/pages/new/galleries/5/edit之類的東西上。

到目前爲止,我一直在向application.html.erb添加邏輯,但事情已經開始失控,我的if語句中有太多的規則,我覺得很骯髒。這裏有一個例子:

從application.html.erb

<% unless current_page?('/') or current_page?('/admin') or current_page?({action: :new}) %> 
    <%= render "layouts/top_links" %> 
<% end %> 

片斷這一切到目前爲止,我已經寫了,但如果我繼續這樣,它幾乎肯定會獲得更長。所以這裏是我的問題:

  1. 我應該把這個邏輯和我應該怎麼稱呼它?
  2. current_page?這是最好的方法嗎?

回答

3

你可以把這樣骯髒的邏輯放到助手,使其更清潔

# layouts/application.html.erb 
nav_links 

# application_helper 
def nav_links 
    return "" if action_name.in?['new', 'edit'] || controller_path == 'admin' 
    render partial: 'layouts/nav' 
end 

完成。

+0

這正是我想要的。 – drewwyatt

+0

我很高興能有一點幫助。 –

1

您可以使用基於角色的方法來推進,因爲它是rails中訪問控制最廣泛使用的方法。實際上,application.html.erb中的所有那些if-else循環都會有一點代碼異味。

查看Ryan Bates CanCan寶石用於此目的。

+0

我真的希望這會工作。無論如何,這可能是我最終做的。不過,這是我的問題:如果管理員訪問該網站時未註銷,我仍然希望鏈接顯示。條件應該基於位置而不是用戶。那有意義嗎? – drewwyatt

+0

這樣做,但你已經描述了與它自己相關的問題。如果你能管理它,那麼根本沒有問題! –

1

一種可能性是利用before_filter,您可以在ApplicationController中設置。你可以做什麼

應用自己的味道,這一點,但一個愚蠢的例子可能是:

class ApplicationController < ActionController::Base 
    before_filter :set_navigation_visibility 

    def set_navigation_visibility 
     # Your custom logic 
    end 

該方法也可以在子控制器如果需要覆蓋,或使用:only:except選項修改。

另一種可能性是利用基於角色的訪問控制系統。有很多,我使用的這樣一個庫是Simple-NavigationA google search for role-based access control for rails似乎產生了一些可能有用的結果。

相關問題