我有一个带有2个角色的rails应用程序,比如admin和user。但问题是,管理员不使用像ActiveAdmin这样的后端。我希望Admin和User都能看到相同的视图,但根据角色,我限制他们可以看到的内容。我正在使用Cancan,但是因为例如管理员和用户都可以看到产品页面,我最终在视图和控制器操作中有很多条件,例如,如果这是一个管理员节目,如果没有那么显示相反。
所以我并不认为这是“Rails方式”。我最终得到了许多重复的代码,并且视图中的代码并不真正支持将逻辑远离视图的想法。
所以我的问题是,实现具有多个角色但观点相同的场景的最佳方式是什么。
谢谢。
我现在想到两种选择,但我也不喜欢。一种是将管理员重定向到另一个视图,但这种方式大多数视图是相同的,因此它根本不是DRY。 选项2是使用完全相同的视图,但在视图中添加了许多条件,因此我最终得到了一个包含代码的巨大复杂视图。我正在努力找到一种方法,让事情干燥简单,并保持视图代码免费。
答案 0 :(得分:0)
您可以将admin模块置于单独的命名空间下,将用户置为默认命名空间。您可以在partials下提取公共代码,并在admin和user模块中使用相同的代码。
通过这种方式,您可以分离用户和管理员的代码,如果您决定为管理员和用户选择不同的视图,将来某个时候。它赢得了很多任务。
将控制器设为
app / controllers / admin / articles ------适用于管理员用户
app / controllers / articles ----适用于普通用户
和
观看次数
app / views / admin / articles
app / views / articles
应用程序/视图/共享
答案 1 :(得分:0)
有不同的可能方法。如here
所述,我们会想到“装饰者”模式的变体我上次阅读它已经有一段时间了,但我认为基本的想法是将逻辑放在模型或帮助器中。一旦用户登录并且您可以看到他是管理员还是普通用户,您就拥有返回必要的html或文本的方法。
一种更简单的方法就是让所有东西都有两个部分。正如Ross在一个单独的管理命名空间中说的那样,或者甚至更简单(但如果你以后需要更改它,还需要更多工作)就像_user_view_something.html.erb和_admin_view_something.html.erb。
有些类似的想法进入DCI模式。 This Blog给出了一个很好的概述,它如何在Rails中发挥作用。这篇文章更多的是关于权限,但基本的想法是用必要的函数补充用户对象。
所以你有基本的“do_something”方法,它在视图中呈现某些信息或放置一些信息,并将其替换为适合实际用户角色的信息。