在为不同用户类型创建子域时,控制器操作的良好实践

时间:2014-09-13 01:39:33

标签: ruby-on-rails ruby-on-rails-4

我正在为不同的用户类型创建子域名,并且想知道这样做的好习惯是什么。我有用户类型admineditorgrader及其子域名admin.somesite.comeditor.somesite.comgrader.somesite.com

我遇到的问题是如何建模控制器操作和某些用户类型之间的连接。如果我对子域admin的root有以下内容:

match '/' => 'supers#main_site', :constraints => { :subdomain => 'admin' }

我有Article的模型,可以editoradmin进行修改。我已在edit内实施ArticlesController操作验证,该操作会检查登录用户是editor还是admin。如果没有,我将他转移到错误网站。

我的问题是,我是否需要以某种方式限制文章编辑到这样的特定域:

match '/articles/:id/edit' => 'articles#edit', :constraints => { :subdomain => 'admin' }
match '/articles/:id/edit' => 'articles#edit', :constraints => { :subdomain => 'editor' }

或者只是导航到文章编辑就足够了,而我已经在该域内导航了?因此,如果editor已登录其域editor.somesite.com并且他点击了主页上的文章,则通常会将他带到editor.somesite.com/articles/:id/edit,如果admin执行此操作,他会看到admin.somesite.com/articles/:id/edit

多个子域和权限的良好做法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

我不了解最佳做法,但我可以告诉你在类似情况下我做过的一些事情。

如果某个应用程序有子域名,我认为每个子域名都是它自己的应用程序。为方便起见,他们可能共享相同的Rails项目并可以访问相同的模型和资产。但是,我的心态是它们是独立的应用程序,它们影响了以下决策。

我最终分割了我的路线。您可以使用constraints方法按用户类型对资源进行分组。例如:

constraints subdomain: 'admin' do
  # All the admin routes
end

constraints subdomain: 'editor' do
  # All the editor routes
end

这使得确定谁有权访问内容非常简单,并且因为您不会一遍又一遍地重复, constraints: { subdomain: <role> }而使每条路线变得不那么复杂。基本上,你正在做的是,&#34;以下是管理应用程序中的路由,这里是编辑器应用程序中的路由。&#34;

我做的另一件事是为每个角色创建特定的控制器。我最初拒绝这一点,认为要弄清楚每个角色与每个动作的关系并不是很困难。然而,在分割出特定于角色的控制器之后,我对每个动作变得多么简单感到震惊。对于许多非常简单的方法,权衡是一些相当复杂的行为。

有些项目特定的规则可能会让我的角色比你的更复杂,但这些是我考虑过的事情。