接触 rails 有两年了,有大项目的开发经验,也有自己负责小项目前端 + 后端 + 服务器部署的经验。
用的框架是 RoR, React.js(比较推荐), Stimulus.js(特别安利), Foundation, Bootstrap。
看过的 ruby 方面的书有:Ruby on Rails 教程,面向对象设计实践指南 :Ruby 语言描述,Ruby 元编程。
最开始是看官方文档 + Ruby on Rails 教程( https://ruby-china.org/topics/39192 ),几天后开始在公司内部项目做一些小改动,一个月后开始半学半做的接手一个新项目。两年的外包工作下来,感觉 rails 蛮多是一个熟练的过程,上手还是比较快的。多做项目,做真正的项目能极快的上手 RoR。
想分享给大家的是上手到现在这 2 年过程中的一些个人经验和个人看法。
Controller 想分享的一个是避免 N+1,另一个是把复杂逻辑集成到 service 中。
N+1,我看到过在一些比较大的项目,一个 API 调用或者一次页面刷新,数据库的访问几十几百次,ActiveRecord 的 load 时间需要几百 ms,如果解决了 N+1 的 wen ti,这个时间至少能缩短 1/10。我一般是在 controller 中使用 rails 的 incluces 方法 preload 所需要的 associations 来避免 N+1。这里推荐一个 gem bullet( https://github.com/flyerhzm/bullet ),可以在 console,浏览器 console 等各种地方给出提示警告和解决方案,特别好用。
把复杂逻辑集成到 service 中,对以后代码维护修改都特别好,代码可读性高,写单元测试也比较好写。一个 controller 的 method 只做一件事情(视具体情况),尽量遵循单一功能原则。我看有蛮多人写的 controller 的 method 根据传的参数不同,会有不同的功能表现;有的还把 update 和 create 的功能混在一个 method 里面。还有就是尽量把 model 的处理放到对应的 controller,不要把一个 model 的一些 CRUD 放到别的 model 对应的 controller 中进行处理。我看到过有的人把 model 的 CURD 方法放到了这个 model 的 associations 的 model 的 controller 中。对代码的阅读,功能扩展修改都造成了很大的困扰。
测试方面的话我用的是 Rspec,然后用 simpleCov 来看测试覆盖率(一般尽量达到 controller, model, service, concern, helper 的 100% 覆盖,高测试覆盖率是你以后功能扩展修改的强力后盾),之后我可能会再写一个帖子来谈谈编写自动化测试的经验和分享一些想法。
推荐一些我觉得好用的 gem:
binding.pry
就可以在 console 中进行调试assigns
都是一些很粗浅的见解,希望对想要接触或者刚接触 rails 的人能有点帮助,也欢迎大佬们指正。