【问题标题】:Rails Routes/Controller/Directory Structure design questionRails Routes/Controller/Directory 结构设计题
【发布时间】:2011-09-03 17:57:10
【问题描述】:

我有一个设计问题,希望得到深思熟虑的答复。

假设您有一个简单的应用程序(例如),它有一个用户、公司和主题模型。一家公司has_one 主题和has_many 用户。

管理员(用户)可以完全管理公司、用户和主题 - 整个 REST 堆栈,以及一些其他操作。管理员应该对所有这 3 个资源执行其他用户角色无法执行的操作。

我们还有一个公司角色。此角色可以编辑他们自己的公司,也可以从管理员用户添加的主题中选择一个主题作为不错的默认值,或者他们可以制作自己的主题。

公司还可以添加/编辑/删除用户,但仅限于他们的公司。这些页面将具有不同的视图,并且它们将具有与管理员不同的行为 - 有些重叠,但有些东西会受到限制,而另一些会被添加。

现在,我们有一些重要的设计选择,我想知道最佳实践是什么。

第 1 部分

在 Rails 中,为管理员设置resources :users, :companies, :themes 并为公司用户设置resource :company, :theme, :users 是有意义的。

当然,我们在这里遇到了一些命名冲突——单数和复数——所以我们可能想尝试像resource :my_company, :my_theme, :my_users 这样的东西来分隔它们?还是有更好的解决方案?

此外,主题只是公司的一个组成部分,所以也许我们想嵌套它们?

:resource :my_company do
  :resource :theme
  :resources :users
end

这可以正常工作,但它可能会混淆我们指的是哪个用户控制器......不是吗?这真的很棘手,我很想知道如何处理这个问题。你有1个控制器,还是2个?你给他们起什么名字?

所以这就是一个例子:

http://myapp.com/my_company/theme/edit
http://myapp.com/my_company/users/1/delete

公司用户也可能希望通过 ajax 获得主题列表,因此他们调用是否正确:

http://myapp.com/themes.json

?

这是如何处理这种情况,还是有更好的方法?

第 2 部分

另外,您的目录结构应该是什么样的?您是否应该按用户角色分隔控制器?

/app/controllers/admin/companies_controller.rb
/app/controllers/admin/themes_controller.rb
/app/controllers/admin/users_controller.rb
/app/controllers/company/my_company_controller.rb
/app/controllers/company/theme_controller.rb
/app/controllers/company/users_controller.rb

或者有没有更好的方法来处理这个问题?

users_controller 重复了 2 倍,而且 Theme 和 Themes 之间存在细微差别,这似乎很奇怪。

我非常感谢对此深思熟虑的回应。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby controller routes


    【解决方案1】:

    感谢您组织代码库的愿望,因为我必须不断说服自己不要采取默认的冲动来嵌套资源或命名空间模型。由于这个问题没有正确答案,我只提供我用来说服自己不要这样做的理由。

    • 资源存在于一个地方。 User.find(1) 应该有一个定位器 (URL),我喜欢将其称为 user_path。我喜欢称它为 user_path,因为我一直把它称为 admin_company_user_path([@company, @user]),我每次写它时都会感到不适。
    • 该资源可能会在不同情况下以不同方式呈现自己,例如请求者是 XHR 或表示他们更喜欢德语而不是英语。为什么表明用户是管理员的标题有什么不同?
    • 如果我可以让它看起来像 rails/README 中最简单的示例,我不应该吗?

    在这一点上,我会承认并最终得到:

    /app/controllers/companies_controller.rb
    /app/controllers/users_controller.rb
    /app/controllers/themes_controller.rb
    

    我的 routes.rb 会有:

    resources :users
    resources :companies
    resources :themes
    

    我还应该说明我将如何处理让您首先想要将它们分开的事情 - 每个角色的不同视图。在我的理想情况下,我的决定将导致themes/_form.haml 看起来像:

    = form.input :title if user_can_change_title?
    = form.input :theme if user_can_change_theme?
    

    其余的差异将在 CSS 中处理,可能每个角色都有一个样式表。

    在不太理想的情况下,我可能会使用:

    = render :partial => "#{current_user.role}_form"
    

    【讨论】:

    • 我不认为拥有 3 个控制器和“如果”我的出路会起作用 :( 公司用户无法管理“主题” - 设置/自定义他们的主题与主题无关管理员可以访问的管理选项 - 180 度不同。如果您是管理员用户,则用户配置文件(用于显示和编辑操作)非常不同。它也可能是不同的模型对象。有一些重叠,有些不是。管理员真的不关心很多事情,但是 3 个公司用户角色都关心不同的事情。我想会有'如果'地狱
    • 我明白你的意思,但请记住,心理重量将存在于某处......无论是在用于分隔它们的附加文件/类中,还是在条件句中。关于公司的主题和主题管理,这似乎很自然……只有管理员可以edit_theme,而公司用户可以edit_company,这允许他们选择主题。绝对同情你对“如果地狱”的厌恶!
    猜你喜欢
    • 2011-07-24
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多