我有一个设计问题,在这里,我希望有一个深思熟虑的答复。
假设您有一个简单的应用程序(例如,清酒),它有一个用户、公司和主题模型。A公司has_one主题和has_many用户。
管理员(用户)可以完全管理公司、用户和主题--除了一些其他操作之外,还可以管理整个REST堆栈。管理员应该对所有这些资源执行其他用户角色无法完成的操作。
我们也有公司的角色。这个角色可以编辑他们自己的公司,也可以从管理员用户添加的主题中选择一个很好的默认设置,或者他们只需要制作自己的主题。
公司也可以添加/编辑/删除用户,但只适用于他们的公司。这些页面将有不同的视图,他们将有不同的行为与管理员-一些重叠,但有些东西将受到限制,而另一些将被添加。
现在,我们有一些重要的设计选择,我想知道什么是最佳实践。
第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这是可行的,但我们指的是哪一个UsersController可能会让人困惑.不是吗?这真的很棘手,我很想知道如何处理这件事。你有一个控制器,还是两个控制器?你给他们起了什么名字?
这就是一个例子:
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是重复的2x,并且主题和主题之间有细微的区别。
我非常感谢你对此作出深思熟虑的答复。谢谢!
发布于 2011-05-28 01:48:49
我很感激您组织代码库的愿望,因为我必须不断地说服自己不要采取默认的冲动来嵌套资源或命名空间模型。由于这个问题没有正确的答案,我只会提出我说服自己不要这样做的理由。
User.find(1)应该只有一个定位器(URL),我喜欢称之为user_path。我喜欢称它为user_path,因为每次我写它的时候,我都叫它admin_company_user_path(@company,@user),这让我很不舒服。在这一点上,我会承认,最后是:
/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"https://stackoverflow.com/questions/6158475
复制相似问题