瞎扯淡 分享一点自己的 Rails 学习开发经历经验

fidel · 2019年11月18日 · 最后由 adamshen 回复于 2019年12月02日 · 1336 次阅读

接触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

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中。对代码的阅读,功能扩展修改都造成了很大的困扰。

Test

测试方面的话我用的是Rspec,然后用simpleCov来看测试覆盖率(一般尽量达到controller, model, service, concern, helper的100%覆盖,高测试覆盖率是你以后功能扩展修改的强力后盾),之后我可能会再写一个帖子来谈谈编写自动化测试的经验和分享一些想法。

Gem

推荐一些我觉得好用的gem:

  • gem 'bullet', 避免N+1用的
  • gem 'pry', 很好用的一个开发以及测试工具,在代码中一句binding.pry就可以在console中进行调试
  • gem 'factory_bot_rails',用来自动化创建测试所需数据
  • gem 'faker',用来构造数据的
  • gem 'rspec-rails', rails的测试框架
  • gem 'rails-controller-testing',让你可以在controller测试中使用assigns
  • gem 'simplecov', 用来检查测试覆盖率的
  • gem 'database_cleaner',配置好之后,可以在测试中使用before(:all)来缩短创建activerecord所需时间,缩短测试所需时间
  • gem 'whenever', 用来管理conjob的
  • gem 'exception_notification',用来发送报错邮件的
  • gem 'parallel_tests', 并行测试用的

都是一些很粗浅的见解,希望对想要接触或者刚接触rails的人能有点帮助,也欢迎大佬们指正。

共收到 5 条回复

基本没人接触了吧

感谢分享,有一些包没用过

跟我差不多。 最近很烦的是rails的版本问题。 simple_form的安全漏洞强迫升级到rails5

等自动化测试经验分享

mengmeng 回复

过于真实,感觉论坛这两年都没有新鲜血液。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册