2016-10-11 79 views
0

我有一個用戶可以有多個角色player,coach,guest如何按角色爲不同用戶創建多個視圖?

我希望根據登錄的用戶或查看該配置文件,獲得player_profile (profile/8)的不同視圖。

除了在我的視圖中寫入一串if語句來檢測cancancan權限,有沒有更簡單/更理智的方式來儘可能以時尚的方式解決此問題?

+0

取決於不同的意見。如果幾乎沒有差異,那麼在能力上分支就沒有問題,但如果視圖完全不同,則可以在控制器方法中分支角色/能力並呈現不同的視圖。 – MarsAtomic

+0

@MarsAtomic有些稍有不同,但我更關心那些截然不同的。你能告訴我一個在控制器PLZ中分支的例子嗎?謝謝! – marcamillion

回答

1

要顯示基於用戶角色的不同視圖,可以在控制器中使用一些簡單的分支邏輯。讓我們以show行動爲例:

def show 
    if current_user.role == 'admin' 
    render 'show_admin' 
    else 
    render 'show' 
    end 
end 

這個例子假設你有機會到current_user幫手,無論是從類似設計或自己的解決方案,一個show_admin.html.erb file,一個show.html.erb文件,並在role屬性您User模型。

真的沒有那麼多。

+0

或者您可以簡單地利用部分 –

+0

@Deepak Care來說明? – marcamillion

+0

@Deepak沒有部分例子的原因是因爲OP特別要求「截然不同」視圖的示例代碼。部分意味着意見大部分與部分意見不同。 – MarsAtomic

1

可以渲染視圖動態地立足於用戶的角色:

def show 
    render "show_#{current_user.role}" 
end 

,這會使得show_adminshow_guestshow_xxx底座上CURRENT_USER的作用。但它要求您創建所有這些視圖,並且在未來添加一個可以訪問此路線的新角色時應該注意。

如果以上將是一個問題,但如果該視圖渲染之前存在檢查的方式:

lookup_context.exists?(dynamic_template_name) 

您可以創建一個方法來處理它:

def show 
    render view_for_user(:show) 
end 

private 

# This will render `show_guest` if not user is logged in. Otherwise it will 
# checks if the requested view exists or show a default one (view_name) 

def view_for_user(view_name) 
    return "#{view_name}_guest" unless current_user 

    dynamic_template_name = "#{view_name}_#{current_user.role}" 

    lookup_context.exists?(dynamic_template_name) ? dynamic_template_name : view_name 
end 

希望這幫助。

+0

有趣的潛在答案。感謝你! – marcamillion

相關問題