0

我有一个具有 2 个角色的 Rails 应用程序,比如管理员和用户。但问题是,管理员不使用像 ActiveAdmin 这样的后端。我希望管理员和用户都看到相同的视图,但根据角色,我限制他们可以看到的内容。我正在使用 Cancan,但是由于例如管理员和用户都可以看到产品页面,因此我最终在视图和控制器操作中出现了许多条件,例如,如果这是管理员显示,则显示,而不是显示。

所以我真的不认为这是“Rails 方式”。我最终得到了许多重复的代码,并且视图内的代码并不真正支持使逻辑远离视图的想法。

所以我的问题是,实现具有许多角色但视图相同的场景的最佳方法是什么。

谢谢你。


我目前正在考虑两种选择,但我都不喜欢。一种是将管理员重定向到另一个视图,但这样大部分视图都是相同的,因此它根本不是 DRY。选项 2 是使用完全相同的视图,但在视图中添加了许多条件,因此我最终得到了一个带有代码的巨大复杂视图。我正在尝试找到一种方法,让事情保持干燥但简单,并保持视图代码免费。

4

2 回答 2

0

您可以在单独的命名空间和用户下将管理模块作为默认命名空间。您可以提取部分下的公共代码,并在管理和用户模块中使用相同的代码。

通过这种方式,您可以将用户和管理员的代码分开,并且如果将来某个时候您决定为管理员和用户使用不同的视图。这不会是一项艰巨的任务。

  1. 将控制器作为

    app/controllers/admin/articles ------ 管理员用户

    app/controllers/articles ---- 普通用户

  1. 意见

    应用程序/视图/管理员/文章

    应用程序/视图/文章

    应用程序/视图/共享

于 2012-10-23T09:30:56.687 回答
0

有不同的可能方法。如here所述,我会想到“装饰器”模式的变体

这是我最后一次阅读它的时间,但我认为基本思想是将逻辑放入模型或助手中。一旦用户登录,您就可以查看他是管理员还是普通用户,您有方法可以返回必要的 html 或文本。

一种更简单的方法是只为所有内容设置两个部分。正如罗斯在单独的管理命名空间中所说,或者甚至更简单(但如果您以后需要更改它,则需要更多工作),就像 _user_view_something.html.erb 和 _admin_view_something.html.erb 一样。

有点类似的想法进入了DCI模式。这个博客给出了一些很好的概述这如何在 Rails 中发挥作用。这篇文章更多的是关于权限,但基本思想是用必要的功能补充用户对象。

因此,您拥有基本的“do_something”方法,它可以在视图中呈现某些内容或放置一些信息,并将其替换为适合实际用户角色的方法。

于 2012-10-23T09:44:07.043 回答