ruby-on-rails - 如何在中型 Rails 应用程序中组织 Controller ?

标签 ruby-on-rails model-view-controller controllers

我正在开发一个包含很多相关模型的应用程序,并希望听到一些关于如何最好地组织 Controller 的意见。

以下是我一直在考虑的一些选项:

1)命名空间 Controller 。因此,例如,有一个 controllers/admin 目录和一个 controllers/public 目录。这似乎对组织很有吸引力,但也有点做作,因为单个资源通常可能具有明显属于不同目录的操作(例如,显示操作是公共(public)的,而创建操作是管理员的)。所以这意味着将我的一些资源分成两个独立的 Controller ——一个公共(public)的,一个管理员的。似乎很糟糕。

2) 创建嵌套资源。我只是偶尔使用嵌套资源,因此我并不总是清楚何时最好嵌套资源而不是简单地通过参数明确传递所需的数据。有人对如何最好地使用嵌套资源有一些建议/示例吗?什么时候是个好主意?什么时候是矫枉过正?

3) 只保留默认的脚手架 Controller 。在需要的地方创建新的集合/成员操作,并使用 before 过滤器在每个 Controller 中设置权限。这似乎最吸引人,因为它使事情变得简单。但是我有点担心事情会变得一团糟,因为一些 Controller 可能会因为几个新 Action 而开始膨胀。

如果有设计大型应用程序经验的人可以在这里提供一些指导,我们将不胜感激。

最佳答案

为了在我们的应用程序中进行组织,我根据情况做了一些事情。

首先,关于管理员/用户功能的单独 Controller ,我会说你可能不想走那条路。我们使用了授权和before_filter管理应用程序中的权限。我们推出了自己的产品,但事后看来,我们应该使用 CanCan .从那里你可以设置这样的东西(这是伪代码,实际语言取决于你如何实现授权):

before_filter :can_edit_user, :only => [:new, :create, :edit, :update] #or :except => [:index, :show]

protected

def can_edit_user
  redirect_to never_never_land_path unless current_user.has_rights?('edit_user')
end

或者更高层次
before_filter :require_admin, :only [:new, :create]

并在您的应用程序 Controller 中
def require_admin
  redirect_to never_never_land_path unless current_user.administrator?
end

这取决于哪条路线,但我会用它来授权而不是拆分 Controller 。

至于 namespace 与嵌套资源,这取决于具体情况。在我们的几个应用程序中,我们两者都有。当存在逻辑分离的原因或一组 Controller 之间将共享功能时,我们使用 namespace 。对我们来说,案例和要点是我们将管理功能放在命名空间中,并且在其中我们有用户、角色和其他专有管理功能。
map.namespace :admin do |admin|
  admin.resources :users
  admin.resources :roles
end

然后在这些 Controller 中,我们有一个基本 Controller ,它存储我们的共享功能。
class Admin::Base < ApplicationController
  before_filter :require_admin
end

class Admin::UsersController < Admin::Base
  def new
   ....
end

这为我们提供了数据的逻辑分离,并能够通过共享 before_filter 之类的内容来稍微干掉我们的代码。 .

如果有一段代码你希望在 Controller 之间保留一些东西,我们会使用嵌套 Controller 。我们应用的案例是我们的客户。我们搜索并加载客户,然后在该客户中,他们有订单、票、位置。在该区域内,我们在查看不同选项卡时加载了客户。
map.resources :customers do |customer|
  customer.resources :tickets
  customer.resources :orders
  customer.resources :locations
end

这给了我们网址:
customers/:id
customers/:customer_id/orders/:id
customers/:customer_id/tickets/:id

我们从中体验到的其他优势是易于设置菜单系统和选项卡。这些结构非常适合有组织的网站。

我希望这有帮助!

关于ruby-on-rails - 如何在中型 Rails 应用程序中组织 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3224904/

相关文章:

ruby-on-rails - Rails 4嵌套属性和has_many:通过表单关联

ruby-on-rails - 目录 : $bundle install =>/usr/bin/env: ruby: not a directory

html - Bootstrap - 导航栏不会在移动设备上关闭

ruby-on-rails - 使用 rails form_for 时使用 "_path"的未定义方法

ruby-on-rails - 如何防止更新 Rails 中的单个属性?

javascript - 将 Ember Controller 链接到 View /元素

php - 在 PHP 中进行身份验证的最佳方式

java - 如何对所有 Controller 实现 ResponseBodyAdvice?

c# - 虚拟目录中的 ASP.NET MVC

node.js - Node JS 中所有 Controller 的全局变量