如何在中等规模的 Rails 应用程序中组织控制器?

2024-04-28

我正在开发一个具有相当多相关模型的应用程序,并且想听听一些关于如何最好地组织控制器的意见。

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

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

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

3) 只需保留默认的脚手架控制器即可。根据需要创建新的集合/成员操作,并在过滤器之前使用以设置每个控制器内的权限。这似乎最有吸引力,因为它让事情预先变得简单。但我有点担心事情会变得混乱,因为一些控制器可能会因为几个新动作而开始膨胀。

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


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

首先,关于管理/用户功能的单独控制器,我会说您可能不想走那条路。我们使用了授权和before_filter管理应用程序内的权限。我们自己推出了,但事后看来,我们应该有用CanCan http://github.com/ryanb/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]

并在您的应用程序控制器中

def require_admin
  redirect_to never_never_land_path unless current_user.administrator?
end

这取决于哪条路线,但我会使用它来进行授权,而不是拆分控制器。

至于名称空间与嵌套资源,这取决于具体情况。在我们的几个应用程序中,我们两者兼而有之。当存在逻辑分离或一组控制器之间存在共享功能时,我们使用名称空间。我们的案例和要点是,我们将管理功能放在命名空间中,并且在其中我们有用户、角色和其他专有管理功能。

map.namespace :admin do |admin|
  admin.resources :users
  admin.resources :roles
end

然后在这些控制器中,我们有一个基本控制器,用于存储我们的共享函数。

class Admin::Base < ApplicationController
  before_filter :require_admin
end

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

这为我们提供了数据的逻辑分离以及通过共享诸如before_filter.

如果您希望在一段代码中某些内容在控制器之间保留,我们会使用嵌套控制器。我们的应用案例是我们的客户。我们搜索并加载客户,然后在该客户中,他们有订单、票据和位置。在该区域内,我们在查看不同的选项卡时加载了客户。

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

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

我希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在中等规模的 Rails 应用程序中组织控制器? 的相关文章

  • Rails 3 UJS 干客户端 + 服务器端表单验证

    使用 jQuery 进行表单验证就像向字段添加类名一样简单 使用 Rails 进行表单验证就像将条件放入控制器 和 或模型 中一样简单 我认为应该有一种方法可以编写一次验证并将它们应用到客户端和服务器端 我一直热衷于编写自己的 javasc
  • 如何在配置/初始化程序中使用 YML 值

    我正在努力将 Facebook 集成到我的应用程序中 为此 我使用 koala devise 和omniauth 对于考拉 我有 config facebook yml development app id 123123132123 sec
  • Rails-自定义删除前确认对话框的视图

    要删除 Rails 中的记录 我使用此代码 result of which I get dialog box like this But I wants this dialog box to look like this 有没有办法自定义确
  • 为什么 .each 在我的 Rails 视图中完成后会重复数组? [复制]

    这个问题在这里已经有答案了 在我的 Rails 视图页面中 我有以下循环 它应该循环遍历我的 tag list 数组并打印每个标签 由于某种原因 它在打印每个单独的标签后会重复该数组 例如 这个数组有两个元素 ruby python 每个方
  • application.css 未作为资产提供

    编辑4 5和6 8小时后 欢迎任何更多的想法 也许这个错误已经被知道并解决了 但是当你在 app assets stylesheets 的 css erb 文件中有这个时 我得到了我在编辑 2 3 中描述的行为 li background
  • 遏制gem安装:捆绑安装失败,但正常gem安装有效[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions solve
  • 具有多个可选参数的 Rails 3 路线

    我正在尝试创建一个具有可选参数和不同顺序的 Rails 路线 这个问题描述了一个类似的问题 具有多个 可选且漂亮参数的路由 https stackoverflow com questions 14007593 routes with mul
  • 如何将openId与rails 3中的设备集成

    我是 Rails 新手 刚刚完成了一个简单的设计设置 我正在寻求实现一些仍然使用核心设计功能集但允许通过 openid 提供商登录而不是 使用电子邮件或用户名注册 的东西 我如何开始使用最新的设计宝石和rails 3 看看devise op
  • 使用 prawnto_2 gem 加载图像时,RAILS_ROOT 不再有效

    我正在将我的应用程序从 Rails 3 0 升级到 Rails 3 1 我已经尽可能地将旧插件转为 gems 其中包括用这个漂亮闪亮的新插件替换旧的 prawnto 插件对虾 2 https github com forrest prawn
  • 捆绑包 - 从另一台电脑复制粘贴宝石

    我正在尝试设置 Rails 应用程序 该应用程序依赖于大量的宝石 宝石已预先安装在vendor gems我从朋友那里获得的副本的文件夹 现在 考虑到那些闭源宝石的不可用性 bundle install path home umang pro
  • 如何使用回形针对多页 pdf 进行缩略图

    我想让 Paperclip 为上传的多页 PDF 文件的每一页创建 2 个缩略图 我正在运行 Paperclip 2 3 1 1 并在我的资产模型中使用它 has attached file asset styles gt medium g
  • 如何在 Rails 中制作动态下拉菜单?

    我正在开发一个电子商务项目 其中将有用于选择尺寸的单选按钮 我有一个数量下拉菜单 我想根据用户所选尺寸的可用库存使此下拉列表动态化 谁能告诉我如何在 Rails 上做到这一点 不会用大量的 javascript 扰乱我的视图文件 如果您使用
  • Rails 日志太详细

    如何防止 Rails 记录过多日志 这是我的 production log 文件中的典型跟踪 许多部分 缓存命中 它在开发中很有用 但我不希望在我的生产环境中使用它 Started GET redirected true for 46 19
  • Watir 脚本偶尔返回 Net::ReadTimeout 错误

    我有一个 Watir 脚本 偶尔会意外地返回此错误 Net ReadTimeout 我搜索了这个错误并发现这个问题 https stackoverflow com questions 47452276 watir get sometimes
  • 从 Facebook 重定向 URL 中删除“#_=_”[重复]

    这个问题在这里已经有答案了 根据https developers facebook com blog post 552 https developers facebook com blog post 552 FB Graph API 现在附
  • 如何在 Rails 2.3.5 中从模型渲染部分

    我有一个 Rails 2 3 5 应用程序 我试图从模型中渲染几个部分 我知道 我知道 我不应该这样做 我这样做的原因是我将 Comet 服务器 APE 集成到我的 Rails 应用程序中 并且需要根据模型的事件 例如 after crea
  • Rails 5 deviseomniauth-facebook 错误:抱歉,出了点问题

    我按照 Devise 的官方指南从上到下本节 https github com plataformatec devise wiki OmniAuth Overview logout links My CALLBACK URL is http
  • 如何通过 FluentValidation 验证上传的文件

    如何使用 FluentValidation 验证上传的文件
  • Rails 的 Puma Systemd 配置不起作用

    我已经完成了一个使用 Ruby on Rails 构建的应用程序 现在我想将其托管在 AWS 上的 EC2 实例上 我已经为其配置了服务器 并且正在使用pumaHTTP服务器作为应用服务器 在生产中启动应用程序总是需要我运行RAILS EN
  • 如何编写运行 Rails db:migrate 任务的 rake 任务?

    我想运行 db migrate VERSION 0 然后在我自己的 rake 任务中运行 db migrate 我对如何做到这一点感到困惑 我需要特殊的要求声明吗 我的 rake 任务将驻留在 Rails 应用程序的 lib tasks 目

随机推荐

  • Java,ASM:如何从ASM InsnNode获取操作码名称和TagValue?

    我正在研究一些类文件分析 并且正在研究使用 ASM 来读取类 在 Javap 中 操作码以及 tagName 和 tagValue 是内联打印的 但在每个 AbstractInsnNode 中 我只看到 int 的字段 而不是 tagVal
  • 奇怪的 Rails 路由行为:两个 id 在嵌套资源中交换

    我在我的应用程序中设置了以下路由 表单属于一个站点 map resources sites do site site resources forms end 但是 当我尝试使用帮助程序 例如 edit site form path form
  • CSS中的继承是什么意思? [复制]

    这个问题在这里已经有答案了 我经常使用background inherit 像这样 许多其他 CSS 属性接受继承作为值 但有什么作用inherit意思是 它是如何工作的 inherit只是意味着样式将从元素的父元素继承 例如 jsFidd
  • Pulp.pulpTestAll() 测试失败,太多值无法解压

    我的操作系统是window 7 Pulp版本是1 6 1 gurobi版本是7 0 1 可以成功导入gurobipy Pull solvers GUROBI确实通过了测试 所以我可以使用gurobi 然而 pulp solvers CPLE
  • iOS 不同设备的单一尺寸类别中的不同字体大小

    在iOS 8中 我们可以为每个尺寸类别设计不同的UI布局 我面临的问题是 我设计了紧凑宽度和常规高度的布局 纵向所有 iPhone 的尺寸类别 但我想为 3 5 和 4 英寸设备 iPhone 4 和 5 保留较小的标签字体大小 然后对于
  • IntelliJ IDEA 的 Mylyn 替代品?

    我们公司已经使用 Unfuddle 一年了 我所有的同事都可以使用名为 Mylyn 的 Eclipse 插件轻松访问 Unfuddle 票证 IntelliJ IDEA 是否存在类似的东西 如果没有 你能建议一些替代方法来处理来自 IDEA
  • iPhone 开发——performSelector:withObject:afterDelay 还是 NSTimer?

    重复方法调用 或消息发送 我猜合适的术语是 x秒 是使用 NSTimer NSTimer 的 ScheduledTimerWithTimeInterval target selector userInfo repeats 还是让该方法在最后
  • C++11 中的“类模板Example;”语句是什么意思?

    我已被提及 显式模板实例化 http www cplusplus com articles 1C75fSEw at cplusplus com http www cplusplus com 给出了以下示例 template
  • 如何用好Fortran语句标签?

    我正在开发一个用 Fortran 95 编写的模型 我对此完全陌生 语句标签的概念似乎很奇怪 到目前为止我只找到了标签可以由作者任意决定的解释 通常以 10 为增量 除了更容易地找出语句的结尾位置之外 这些标签还有其他实际用途吗 以及关于如
  • 会话在 Laravel 5.4 上不持久

    我在 Laravel Sessions 方面遇到了一些问题 现在我在 Laravel 5 4 下工作 所以 我使用以下代码来设置会话 request gt session gt put usuario somevalue 但是当我尝试使用以
  • 您必须至少选择一个列出的平台才能显示

    我正在创建一个简单的应用程序 当我尝试保存更改时收到此错误 您必须至少选择一个要显示的列出平台 请参阅此处的屏幕截图 http panstickers com au webimages fb error gif http pansticke
  • Ace编辑器使用javascript触发事件

    有没有类似的东西 editor getSession trigger change 我想要这个的原因是因为编辑器进出新的 所以当它返回视图时我需要它做正常的 更改 事情 但我不想等待用户输入 目前我有 editor getSession o
  • 如何解决curl php中的HTTP/1.1 400 Bad Request

    我必须打一个 aspx来自 php 代码的页面 url 我试图使用curl 来访问 但出现以下错误并且 url 中没有空格 HTTP 1 1 400 Bad Request Content Type text html charset us
  • PHP 通过 FTP 下载整个文件夹(递归)

    我目前有一个非常大的网站 大小约为 5GB 包含 60 000 个文件 当前主机并没有做太多事情来帮助我将网站转移到新主机 我的想法是在新主机上制作一个简单的脚本 通过 FTP 传输到旧主机并下载整个 public html 文件夹 递归地
  • 在进行字符识别之前使用 OpenCV 进行图像预处理(超正方体)

    我正在尝试开发简单的 PC 应用程序用于车牌识别 Java OpenCV Tess4j 图像不是很好 进一步它们会很好 我想对超立方体图像进行预处理 但我被困在车牌检测 矩形检测 上 我的步骤 1 源图像 Mat img new Mat i
  • 在 Matlab、VB6 和 VB.NET 程序之间发送消息的最简单方法

    我们正在将一套数据采集和分析例程从 VB6 程序升级为 VB NET VB6 和 Matlab 程序的混合体 我们希望保持系统模块化 单独的 EXE 以便我们可以轻松创建专门的独立分析程序 而无需不断升级大型应用程序 当所有程序都是用 VB
  • 何时在 Springs @Configuration 中将 proxyBeanMethods 设置为 false?

    当查看 spring 自动配置时源代码 https github com spring projects spring boot tree master spring boot project spring boot autoconfigu
  • 如何用Spring进行只读和读写的数据库路由

    我正在研究 Spring 中的事务路由 但我的应用程序存在运行时问题 我有两个 MySQL 数据库 一个用于读取 一个用于读 写 但是我的路由配置不起作用 当我应用只读配置时 我没有成功 这是我的配置 pom xml
  • Akka、SQS 和 Camel 的消费者投票率

    我正在做的一个项目需要从SQS读取消息 我决定使用Akka来分布式处理这些消息 由于 Camel 支持 SQS 并且在 Consumer 类中内置了 Akka 中使用的功能 因此我认为最好以这种方式实现端点并读取消息 尽管我还没有看到很多人
  • 如何在中等规模的 Rails 应用程序中组织控制器?

    我正在开发一个具有相当多相关模型的应用程序 并且想听听一些关于如何最好地组织控制器的意见 以下是我一直在考虑的一些选择 1 为控制器命名空间 例如 有一个controllers admin 目录和一个controllers public 目