首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails路由/控制器/目录结构设计问题

Rails路由/控制器/目录结构设计问题
EN

Stack Overflow用户
提问于 2011-05-27 23:05:00
回答 1查看 771关注 0票数 1

我有一个设计问题,在这里,我希望有一个深思熟虑的答复。

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

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

我们也有公司的角色。这个角色可以编辑他们自己的公司,也可以从管理员用户添加的主题中选择一个很好的默认设置,或者他们只需要制作自己的主题。

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

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

第1部分

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

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

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

代码语言:javascript
复制
:resource :my_company do
  :resource :theme
  :resources :users
end

这是可行的,但我们指的是哪一个UsersController可能会让人困惑.不是吗?这真的很棘手,我很想知道如何处理这件事。你有一个控制器,还是两个控制器?你给他们起了什么名字?

这就是一个例子:

代码语言:javascript
复制
http://myapp.com/my_company/theme/edit
http://myapp.com/my_company/users/1/delete

公司用户也可能希望通过ajax列出主题列表,所以他们调用:

代码语言:javascript
复制
http://myapp.com/themes.json

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

第2部分

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

代码语言:javascript
复制
/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是重复的2x,并且主题和主题之间有细微的区别。

我非常感谢你对此作出深思熟虑的答复。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-28 01:48:49

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

  • 资源曾经生活在一个地方。User.find(1)应该只有一个定位器(URL),我喜欢称之为user_path。我喜欢称它为user_path,因为每次我写它的时候,我都叫它admin_company_user_path(@company,@user),这让我很不舒服。
  • 这个资源可能会在不同的情况下以不同的方式呈现出来,比如请求者是XHR,或者表示他们更喜欢德语而不是英语。为什么头表明用户是管理员有什么不同?
  • 如果我可以使它看起来像是rails/自述文件中最简单的示例,对吗?

在这一点上,我会承认,最后是:

代码语言:javascript
复制
/app/controllers/companies_controller.rb
/app/controllers/users_controller.rb
/app/controllers/themes_controller.rb

我的routes.rb会:

代码语言:javascript
复制
resources :users
resources :companies
resources :themes

我还应该说明如何处理使您首先想要将它们分开的事情--为每个角色提供不同的视图。在我理想的场景中,我的决定会产生一个themes/_form.haml,看起来如下:

代码语言:javascript
复制
= form.input :title if user_can_change_title?
= form.input :theme if user_can_change_theme?

其余的差异将在CSS中处理,可能会为每个角色提供一个样式表。

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

代码语言:javascript
复制
= render :partial => "#{current_user.role}_form"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6158475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档