文章摘要
作者在长期开发Rails应用时,经常遇到团队对文件存储管理的需求,如查看存储使用情况、未关联文件、文件类型统计等。为解决这些问题,作者深入研究了Rails引擎,并开发了Active Storage Dashboard,这是一个可挂载的Rails引擎,提供了现代化的界面,用于监控和管理Active Storage数据,简化了非技术团队成员的使用流程。
文章总结
文章主要内容总结
标题: 构建模块化Rails应用:通过Active Storage Dashboard深入探讨Rails引擎
作者: Giovanni Panasiti
来源: Panasiti.me
1. 背景与问题
作者在过去的10年中,每天构建Rails应用,并且几乎所有应用都使用了Active Storage。随着用户上传文件的增加,团队和利益相关者经常提出以下问题: - 我们实际使用了多少存储空间? - 能否查看哪些文件已不再使用? - 用户上传最多的文件类型是什么? - 是否有办法浏览所有存储的文件?
为了解决这些问题,作者通常通过Rails控制台编写查询来获取答案,但这种方式不可持续。因此,作者决定开发一个可视化的仪表盘,供非技术人员使用,无需访问生产服务器。
2. Active Storage Dashboard的引入
Active Storage Dashboard 是一个可挂载的Rails引擎,提供了现代界面来监控和管理Active Storage数据。它具备以下功能: - 实时存储统计和使用指标 - 可浏览的blob、附件和变体记录 - 高级过滤功能 - 直接从仪表盘下载文件 - 清理孤立文件的维护任务 - 支持表格和卡片视图布局 - 内容类型分布的漂亮可视化
3. Rails引擎:模块化设计的英雄
Rails引擎是Ruby on Rails框架中最强大但未被充分利用的功能之一。引擎是微型Rails应用,可以挂载到主Rails应用中,具备自己的模型、视图、控制器、路由和资源,设计为可插拔和可重用。
4. Rails引擎的解剖
Active Storage Dashboard的目录结构与常规Rails应用相似,包括app、config和lib目录。关键区别在于engine.rb文件,这是引擎的核心。
5. 构建生产就绪的引擎:从Active Storage Dashboard中学到的经验
作者分享了构建强大且易用引擎的关键设计决策和实现细节,包括: - 路由和URL生成:确保URL正确生成 - 配置灵活性和认证策略:提供多种认证策略,便于集成现有安全基础设施 - 跨Rails版本兼容性:确保引擎在不同Rails版本中无缝工作 - 零外部依赖哲学:使用纯JavaScript和CSS构建UI,避免依赖冲突 - 数据库无关的实现:确保统计和查询功能在不同数据库适配器中工作 - 智能文件预览处理:根据内容类型和Rails版本能力处理文件预览 - 维护任务的Rake任务:提供强大的维护任务,如清理孤立文件
6. Rails引擎的广泛影响
Rails引擎的优势包括: - 快速功能开发:允许团队在隔离环境中开发功能 - 代码跨项目重用:引擎可以在多个应用中重用 - 逐步分解单体应用:为分解单体应用提供过渡 - 开源贡献机会:引擎可以提取并分享给社区
7. 引擎开发的最佳实践
作者总结了引擎开发的最佳实践,包括: - 命名空间化:确保所有类、模块和数据库表都有命名空间 - 提供配置选项:使引擎可配置,并提供合理的默认值 - 详细文档:包括安装说明、配置选项和用法示例 - 保持依赖最小化:避免依赖冲突 - 设计扩展性:提供钩子和扩展点 - 优雅处理错误:引擎不应导致主应用崩溃 - 安全第一:永远不要信任用户输入 - 语义版本控制:遵循语义版本控制
8. 引擎作为更好软件架构的路径
Rails引擎不仅是锦上添花的功能,而是构建可维护和可重用解决方案的强大工具。通过拥抱引擎,我们可以在部署上保持单体应用,而在设计上实现模块化。
9. 鼓励开源
作者鼓励开发者探索引擎,提取现有应用中的功能,构建解决重复问题的工具,并与社区分享。Rails生态系统在开发者创建和分享模块化、可重用组件时蓬勃发展。
Active Storage Dashboard已在GitHub上开源,欢迎贡献、反馈和使用故事。通过共同努力,我们可以继续推动Rails引擎的可能性,为Rails应用创造更模块化、可维护的未来。
评论总结
对Rails Engines的正面评价:
- 评论2(helle253)表示:“我喜欢Rails Engines,这是一个非常巧妙的功能。最近我将一个功能集从一个Rails项目迁移到另一个项目,作为一个挂载的引擎,确保隔离性(但不是必需的)非常有帮助。”
(原文:I love Rails Engines, it's a very slick feature. I recently migrated a featureset from one Rails project into another, as a mounted engine, and ensuring isolation (but not requiring it!) has been tremendously helpful.) - 评论4(GGO)认为:“Rails Engines是最被低估的功能之一,每个人都应该更多地使用它。”
(原文:Rails engines are one of the most underrated features that everyone should be using more.)
- 评论2(helle253)表示:“我喜欢Rails Engines,这是一个非常巧妙的功能。最近我将一个功能集从一个Rails项目迁移到另一个项目,作为一个挂载的引擎,确保隔离性(但不是必需的)非常有帮助。”
对Rails Engines的探索与兴趣:
- 评论3(hk1337)提到:“我最近一直在研究使用Rails Engines,尝试将一个想法付诸实践。”
(原文:I have been looking at using Rails Engines recently playing around with trying to get an idea off the ground.) - 评论5(matltc)感慨:“很少在现实中看到Rails的身影。”
(原文:Miss seeing rails in the wild.)
- 评论3(hk1337)提到:“我最近一直在研究使用Rails Engines,尝试将一个想法付诸实践。”
对过度复杂化的批评:
- 评论1(henning)批评道:“这篇博客展示了库和框架如何解决一个问题却制造另一个问题。这导致了一些荒谬的句子,比如‘构建引擎最棘手的方面之一是正确处理路由’,如果你只是编写简单的代码来解决眼前的问题,而不是做一堆‘模块化’‘引擎’框架式的编译器式的废话,这根本不会成为问题。”
(原文:This blog post just shows how libraries and frameworks often solve one problem but create another. This leads to the emission of ridiculous sentences likeOne of the trickiest aspects of building engines is handling routing correctlywhich would be a non-issue if you just wrote simple code to solve the problem in front of you instead of doing a bunch of "modular" "engine" framework-y compiler-y nonsense that adds boatloads of complexity just to accomplish one basic thing like handling file uploads.)
- 评论1(henning)批评道:“这篇博客展示了库和框架如何解决一个问题却制造另一个问题。这导致了一些荒谬的句子,比如‘构建引擎最棘手的方面之一是正确处理路由’,如果你只是编写简单的代码来解决眼前的问题,而不是做一堆‘模块化’‘引擎’框架式的编译器式的废话,这根本不会成为问题。”
对模块化设计的讨论:
- 评论7(mrinterweb)指出:“微服务架构最初流行的原因之一是为了分解单体应用。在许多情况下,我敢说主要驱动力是缺乏关注点分离,人们希望有更模块化的设计。Rails Engines是使Rails应用更模块化的一种好方法。”
(原文:One of the reasons microservice architecture originally became popular was to break apart monolithic applications. In many cases, I bet a big driver was a lack of separation of concerns, and a more modular design was desired. Rails engines are a good way to make more a rails app more modular.) - 评论6(capevace)提到:“Laravel的Filament包允许你构建类似的封装‘插件’,这些插件基本上是迷你Laravel应用,可以轻松添加到现有应用中。”
(原文:The Filament package for Laravel lets you build similarly encapsulated „plugins“, that are basically mini Laravel apps, that can be easily added to existing apps.)
- 评论7(mrinterweb)指出:“微服务架构最初流行的原因之一是为了分解单体应用。在许多情况下,我敢说主要驱动力是缺乏关注点分离,人们希望有更模块化的设计。Rails Engines是使Rails应用更模块化的一种好方法。”
对分页问题的担忧:
- 评论8(malkosta)警告:“基于偏移的分页在大表上会成为一个问题。”
(原文:Offset-based pagination will be a problem on big tables.)
- 评论8(malkosta)警告:“基于偏移的分页在大表上会成为一个问题。”
总结:评论中对Rails Engines的评价总体较为正面,认为其有助于模块化设计和功能迁移,但也有人批评过度复杂化的问题。此外,评论者还讨论了模块化设计的其他方式(如微服务和Laravel插件),并对分页技术在大数据场景下的局限性表示担忧。