我只是一个Rails的使用者,很多的事情了解得并不深,视角和深度都有限,发这个帖子除了提出自己的疑问,更主要是希望听听大家意见,分享大家的心得。
engine被加入rails core曾经是一件很令我开心的事情,尤其是当我需要把一些固定的独立的MVC逻辑写成gem或者plugin的时候,原先大量的hack工作都消弭于无形。但是现在,我个人是觉得现在这个engine有点过了。
首先,作这个事情的目的有点过了,负责重构engine部分的Piotr Sarnacki坦言说作3.1里的这个重构的初始目标是mountable application,让一个process运行多个application, 比如说一个论坛,一个eshop可以打包作成一个gem或者类似的什么,需要的时候放进Gemfile就行。后来在同Carl和José讨论后决定作成mountable engine是一个近期更为可行的思路。实话实说,我很想知道为什么会想要让一个process运行多个application,分开运行有什么不好吗?包在一起不是把一大堆原本不需要rails实例关心的事情拉进rails了吗?
然后,手段也有点过了。举个例子,很多童鞋估计都看过这个
Mountable apps tutorial,为了能在plugin(or gem)下使用railtie里的generator,也为了测试需要,作者甚至直接加了一个假的rails project到生成的plugin里,而且把这个project放在生成的test/dummy文件夹(订证一点:也可以通过--dummy-path来制定位置)下。这本身就造成了很多混乱。首先这个rails实例并不只是test在用,rails这个命令也要用——生成的plugin里的script/rails直接就会去引用它,这是第一乱,test和development混成一团。然后,如果我不愿意用minitest测试,在创建plugin时加一个-T ,直接这个test文件夹就不会生成,这个dummy rails就不会存在,然后所有generator,所有作者引以为豪的类rails行为都无意义了。作者既然是参考enginex来作的这个plugin generator,为什么不看看enginex下大家为了测试engine plugin常用的diesel呢。
接着,在使用上也有点乱。举个例子,现在需要做一个投票功能的Gem,需要加一个migration。
好,现在有两种做法。
一个是把gem做成一个mountable engine,然后在gem下直接用rails g migration blabla生成migration ,然后在把这个Gem加入项目的Gemfile,再然后项目下就有一个rake命令(比如这个gem叫xyxy,命令就是rake xyxy:install:migrations),可以把这个migration拷到项目的db/migration文件夹内,并且自动解决掉migration序列号的问题。感觉还行,是吧?剔除这个功能本身的实现代码不看,是挺best practise的。
第二个是不把gem做成engine gem,就普通的一个lib文件夹,利用thor的一些方法做一个generator,给migration做一个template,用的时候把gem加入项目里的Gemfile,之后,直接在项目里rail g xyxy:migration,thor的方法也会自动解决序列号的问题。这个也挺干净利落,挺best practise的。
第一种做法用起来会很轻松,从头到尾就是几个现成的shortcut,两分钟完事了,而且几乎是个很坦然的无bug过程,但是生成的代码会有不少冗余,生成的mountable engine gem里有一堆你用不着但是不能删的文件夹;第二种做法要自己写一个generator,代码上很DRY,行行代码都是过脑子出来的,但也就意味着会有bug会花更多时间。
说这个例子与其说是提出问题,不如说是提出建议。engine除了mountable,是不是能做得更configurable,毕竟对绝大多数gem/plugin来说,只是需要对rails的一小部分进行扩展。写代码是很累的一个事情,我很喜欢shortcut,能不能只吃肉不挨打?
嗯...mountable engine里面的namespace和routes,建议有兴趣的朋友仔细实验过后再用,看起来不错,用起来也是pain in ass。
分享到:
相关推荐
本书《Component-Based Rails Applications》主要介绍了如何使用Rails引擎(Rails Engine)进行基于组件的Rails应用开发,以及如何对应用程序的大型模块进行拆分和模块化。以下是书中一些核心知识点的详细说明: 1....
实际上,Rails 应用程序与 Engine 共享许多功能,因此“它们几乎相同” 我们创造了一个引擎$ rails plugin --help 查看选项$ rails plugin new mathmath --full --mountable --skip-test-unit --dummy-path = spec ...
信息: 演示: /安装 将其添加到您的rails应用程序或引擎的Gemfile中: gem 'beautiful_scaffold'下一个 然后跑bundle install用法 脚手架 ↑ # model : underscore and singular# mountable_engine : underscore# ...
Ruby是一种面向对象的脚本语言,它以其简洁、优雅的语法和强大的社区支持而闻名。在Web开发领域,Ruby与Rails框架的结合更是开创了敏捷开发的新纪元。Rails引擎是Rails框架的一个重要组成部分,它允许开发者创建可...
在Ruby on Rails项目中使用RSPEC创建引擎$ rails plugin new engine_name --mountable可安装或完整? --mountable选项告诉生成器您要创建一个“可安装”且与名称空间隔离的引擎(这可以防止主机应用程序代码与引擎...
#### 1.3 架式产品专用预防措施(Precautions for Rack-Mountable Products) - 在安装架式产品前,请仔细阅读所有相关的安全指引。 - 安装过程中需特别注意防止设备坠落或倾倒。 - 确保安装环境符合设备规格,如...
The CX9000 is a compact, DIN rail-mountable Ethernet controller with Intel® IXP420 with XScale® technology and 266 MHz clock frequency. The connection for the Beckhoff I/O systems is directly ...
This second edition of the bestselling Crafting Rails Applications has been updated to Rails 4 and discusses new topics such as streaming, mountable engines, and thread safety. ☆ 出版信息:☆ [作者...
还有可能改进了多语言支持,让用户可以更方便地切换不同语言界面。 此外,Firefox浏览器支持大量的扩展插件,用户可以根据需求安装各种工具来增强浏览器的功能,如广告拦截器、开发者工具、隐私保护插件等。这些...
本文将对该设备的产品参数、技术指标和功能特点进行详细解读。 产品参数 1. 输入电压:230 V 2. 输出电压:230 V 3. 额定功率:600 W 4. 额定功率(VA):1000 VA 5. 电池类型:铅酸电池 6. 电池数量:1 7. 电池...
IMA(Image Mountable Archive)是一种常见的磁盘映像格式,通常用于存储磁盘的内容以便在虚拟环境中使用。 Windows 2.03的每一个细节都充满了历史的痕迹,它是技术演进的见证,也是我们理解现代操作系统发展的重要...
【文件名称列表】中的 "LOADISO.IMA" 文件,IMA(Image Mountable Archive)是一种常见的磁盘镜像格式,常用于创建软盘、硬盘或光盘的备份。在这种情况下,"LOADISO.IMA" 可能是一个软盘镜像文件,包含了需要在虚拟...
3.1 Mksquashfs options and overview. ------------------------------------ As squashfs is a read-only filesystem, the mksquashfs program must be used to create populated squashfs filesystems. SYNTAX:...
索尼爱立信的副总裁兼采购部负责人PeterCarlsson对英特尔的StrataFlash蜂窝内存M18给予了高度评价,认为其高性能、高密度和高性价比非常适合索尼爱立信的多功能手机产品。 为了加速设计流程和新手机的市场投放,...
2. **Post Mountable LED Mounts**:立柱式LED安装座,提供灵活的安装方式。 3. **IR Alignment Accessories**:红外对准配件,有助于提高LED在安装过程中的精确度。 4. **Electronic Accessories**:电子配件,包括...
AS-N270G2的紧凑尺寸(166(W)x147(D)x56(H)mm)允许其安装在空间有限的工业现场,而壁挂式安装方式(Wallmount, VESA mountable)提供了灵活的安装选项。 #### 总结 Nougat AS-N270G2迷你无风扇嵌入式计算机以其...
此外,英特尔还推出了免授权软件英特尔闪存数据合成器(英特尔FDI)的新版本7.1,该软件提供了一个开放架构,支持闪存文件系统与实时操作系统的集成,新增了Mountable USB、多数据卷支持和RAM缓冲支持等功能,以加速...