Rails-构造管理员/用户/公共控制器的方式

时间:2010-07-06 13:45:04

标签: ruby-on-rails controller

虚构的Rails应用程序具有以下资源:

Photographers
Images
Comments

Photographer有许多Images,其中有许多Comments

每位摄影师都有登录信息,可以查看,上传,编辑和删除他们的图片,评论以及他们自己的个人资料。

管理界面可用,可以编辑图像,摄影师和评论。

此外,摄影师,他们的图像和评论可以从公共界面获得,无需登录,访问者可以添加评论。

我的问题是:构建控制器的Rails方式是什么?我正在考虑为每个“角色”(公共,帐户,管理员)使用命名空间,如下所示:

# For administrator
Admin::PhotographersController
Admin::ImagesController
Admin::CommentsController

# For a logged in photographer
AccountController (?)
Account::ImagesController
Account::CommentsController

# For public
PhotographersController
ImagesController
CommentsController

然而 - 这些控制器的一些方法是重叠的。这是最好的方式吗,即使它不是DRY?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果它们重叠,您可以将基本控制器扩展到帐户/管理名称空间。例如,你做的ImagesController是每个人都能看到的动作。这正常地扩展了ApplicationController。然后你做ImageController的管理版本,并扩展ImagesController。然后在管理版本中为所需的不同行为添加/覆盖方法,或者它可能只是添加一些前过滤器(例如require_admin,例如,检查current_user是管理员用户),并在以后重定向它们。不。

答案 1 :(得分:2)

如你所说,这不是真的干。至少,您可以构建路径和控制器以满足所有要求,例如:

resources :photos, :only => [:index, :show] # offer only index and show actions to public 

scope "/admin" do
  resources :photos # full access for logged in users
end

如果您还需要索引和显示操作,可以在其中添加一些检查以加载不同的视图(假设您有公共和管理布局)。

另一种方法可能是拥有一个独特的布局,没有/ admin / sections,并为登录用户提供编辑功能。因此,如果记录了某些照片的所有者,则允许编辑和显示上下文链接。这是一个品味问题:P