Ruby on rails Rails构建管理员/用户/公共控制器的方式

Ruby on rails Rails构建管理员/用户/公共控制器的方式,ruby-on-rails,controller,Ruby On Rails,Controller,虚构的Rails应用程序具有以下资源: Photographers Images Comments 摄影师有许多图像,这些图像有许多评论 每个摄影师都有一个登录,可以查看、上传、编辑和删除他们的图片、评论以及他们自己的个人资料 管理界面可用,可以编辑图像、摄影师和评论 此外,摄影师、他们的图像和他们的评论都可以从公共界面上获得,而无需登录,访客可以在该界面上添加评论 我的问题是:Rails构造控制器的方式是什么?我想为每个“角色”(public、account、admin)使用名称空间,如下所

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

Photographers
Images
Comments
摄影师
有许多
图像
,这些图像有许多
评论

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

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

此外,摄影师、他们的图像和他们的评论都可以从公共界面上获得,而无需登录,访客可以在该界面上添加评论

我的问题是:Rails构造控制器的方式是什么?我想为每个“角色”(public、account、admin)使用名称空间,如下所示:

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

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

# For public
PhotographersController
ImagesController
CommentsController
然而,这些控制器的一些方法是重叠的。即使没有那么干,这是最好的方法吗


谢谢

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

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

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