我有一個用戶可以有多個角色player
,coach
,guest
。如何按角色爲不同用戶創建多個視圖?
我希望根據登錄的用戶或查看該配置文件,獲得player_profile (profile/8)
的不同視圖。
除了在我的視圖中寫入一串if
語句來檢測cancancan
權限,有沒有更簡單/更理智的方式來儘可能以時尚的方式解決此問題?
我有一個用戶可以有多個角色player
,coach
,guest
。如何按角色爲不同用戶創建多個視圖?
我希望根據登錄的用戶或查看該配置文件,獲得player_profile (profile/8)
的不同視圖。
除了在我的視圖中寫入一串if
語句來檢測cancancan
權限,有沒有更簡單/更理智的方式來儘可能以時尚的方式解決此問題?
要顯示基於用戶角色的不同視圖,可以在控制器中使用一些簡單的分支邏輯。讓我們以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
模型。
真的沒有那麼多。
或者您可以簡單地利用部分 –
@Deepak Care來說明? – marcamillion
@Deepak沒有部分例子的原因是因爲OP特別要求「截然不同」視圖的示例代碼。部分意味着意見大部分與部分意見不同。 – MarsAtomic
可以渲染視圖動態地立足於用戶的角色:
def show
render "show_#{current_user.role}"
end
,這會使得show_admin
,show_guest
,show_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
希望這幫助。
有趣的潛在答案。感謝你! – marcamillion
取決於不同的意見。如果幾乎沒有差異,那麼在能力上分支就沒有問題,但如果視圖完全不同,則可以在控制器方法中分支角色/能力並呈現不同的視圖。 – MarsAtomic
@MarsAtomic有些稍有不同,但我更關心那些截然不同的。你能告訴我一個在控制器PLZ中分支的例子嗎?謝謝! – marcamillion