Gem 推荐 rails-template 给大家, 极速构建一个全新又老道的 Rails 5 项目

lyfi2003 for 深圳市百分之八十网络技术有限公司 · June 29, 2016 · Last by plugine replied at August 20, 2016 · 14834 hits
Topic has been selected as the excellent topic by the admin.

如何极速构建一个新的 rails 项目

分享一个我们 80% 团队使用的 rails 模板,能够极速构建一个符合国情的 rails 5 项目,快速开发。

rails-template 是一个 rails 模板,使用方法很简单:

rails new myapp -m https://raw.github.com/80percent/rails-template/master/composer.rb

特点:快速,最新,最合国情。

注意:适合于 rails 中级以上开发者使用。

它是一个很固执的 rails 5 模板,不接受任何选项,直接帮你应用了目前 "最好" 的组件,应用以下技术栈:

  • Ruby on Rails 5
  • bootstrap 3
  • font-awesome
  • figaro
  • postgresql
  • slim
  • high_voltage
  • carriewave & upyun
  • sidekiq
  • kaminari
  • mina
  • puma
  • lograge

背景

对于一个 Rails 中级选手来说,新项目都需要调整 Rails 缺省配置的很多东西。Github 也有很多 rails-composer 项目,但支持 rails 5 与国内本土化的还没有一个。

我在 80% 团队管理几个项目后,意识到这些重复工作很多,把它们抽取出来,写成一个 rails template. 还可以帮助到其他的团队快速构建新的基于 rails 5 的应用。

rails-template 做了哪些事情?

rails-template 固执地认为,简单大众轻量是选择组件的最重要标准。不提供选项,默认集成,但易于去除,是 rails-template 的特点。

所以 rails-template 选择了以下组件:

  • rails 5

    不仅如此,我们还默认打开了 turbolinks5action cable, 充分利用 rails 5 的快的优势。

  • bootstrap 3

    bootstrap3 依然是最流行的 UI 组件,成熟而灵活,值得集成。rails-template 将这一切都准备好了。

  • postgresql

    不用多说,现在已经成了 rails 的标配了。rails-template 还处理好了 database.yml 的配置与发布。

  • carriewave & upyun

    图片处理几乎是 rails 应用的标配,rails-template 帮你配置好了这一切,只需要将 application.yml 完善即可使用。

  • mina & plugins

    mina 轻而快速,比 capstrano 更简单快速,适合小巧的项目,调整完 config/deploy/production.rb 后,一个 mina setup 即可准备好发布环境,十分方便。

  • slim & coffeescript & high_voltage & kaminari

    使用最简洁有效的方式组织你的 rails 代码,是 rails-template 的目标

  • puma

    puma 已经是 rails 5 的标配,不仅如此,我们还准备了更为合理的 puma.rb 配置,热布署十分简便即可实现。

  • rspec

    rspec, factory_girl 几乎是目前的测试项目标配,我们直接将其配置好。而且会自动随着其版本而更新。

总结

rails-template 是楼主几年 rails 经验总结,也是 80% 团队近期几个项目的实践成果,适合于有一定经验的 rails 工程师使用。能够让你快速创建一个漂亮的 rails 初始项目,尤其是在国内的项目,能够减少大量的重复劳动,自动应用很多最佳实践。

请访问 https://github.com/80percent/rails-template 开始你的 rails5 新项目之旅。

也欢迎你为 rails-template 添瓦,补充使用文档,使其成为国内构建 rails 应用的基石。

@good += 1

# TODO
# learn it

怎么不加入 devise 和 simple_form ?

原来角落也是你的?怎么感觉都是熟人...

@hz_qiuyuanxin devise 跟 simple_form 不是很好的东西,社区里也有一些吐槽,在国内不是很需要。即使需要也非常容易整合。而移除比较麻烦。所以不集成在内。

每天通过 Ruby China 了解到亚飞都在忙着发大招啊

huacnlee mark as excellent topic. 30 Jun 09:56

不能理解不用 simple_form 的想法,哪些表单反复写 HTML 不闲浪费时间么

Bootstrap 可以用 4 了 😌

pry 应该要成为标配吧?

#8 楼 @huacnlee 嗯 可以升到 4 了 👍 simple_form 我再考虑考虑。

#4 楼 @lyfi2003 我一般都会引入 devise 和 simple_form,但具体哪个地方用着舒服就用,不舒服就不用,这不就是 Ruby 的理念么 😌

#11 楼 @hz_qiuyuanxin devise 在国内用的不会很多,因为邮件登录不是首选,这种情况下带来的问题比解决的问题更多,所以不集成它。想添加的话是很容易的,去的时候反而麻烦点。

#12 楼 @lyfi2003 devise 有时候确实很麻烦,simple_form 还是不错的

@jun1st 嗯是的,欢迎 star 与 fork 改进它 😆

好干货。

👍 这两天也在弄这个 还有一个同类参考 https://github.com/RailsApps/rails_apps_composer

postgresql 是 rails 标配?

#16 楼 @lazybios 嗯 起初我也一直用的这个 rails-composer, 不仅选项多,处理完依然有不少组件要改。所以才动手搞了本帖这个项目。

#17 楼 @rdongxie 是的。

#18 楼 @lyfi2003 我新手,介绍下 mysql 和 postgresql 在 rails 的优缺点呢。

#18 楼 @lyfi2003 目前了解到的 postgresql 的类型有 Array 和 Hash,这个用起来比较爽

建议加入 qiniu 等其他云存储服务

#21 楼 @huobazi 又拍的 backend 端可以用 qiniu :)

如果对设计要求太高 用 simple_form 定制起来太麻烦了...不如手写 helper,即使自己封装 form_builder 也容易很多

24 Floor has deleted

赞,rack-mini-profiler 要不要考虑下

#25 楼 @holysoros 好建议,先记下!

刚好要开新项目,太及时了

亚飞又放大招了 😍

#28 楼 @freefishz 欢迎使用 :) 有问题找我,我尽快解决~ #29 楼 @vincentjiang 这个是小招 :)

#7 楼 @huacnlee 已经添加了 simple_form, bootstrap 暂时用 3. 一是 simple_form 对其支持还要改进,也等它正式版出来。

#31 楼 @lyfi2003 哈哈,那你是不是要顺便加个 rails_best_practice、brakeman 以及 dawn 啊,不过这些都是开发环境下跑的就好了。顺便想到的好用的 gem。

#32 楼 @martin91 好东西啊,不过就不默认集成了,需要的话自行加。这一套差不多够了 😀

人之宝石,我之垃圾。

#25 楼 @holysoros 这玩意儿有坑,如果项目是做 api 的话,会导致不能完全禁用 cookie。要自己 hack 下。

赞,收藏了

#33 楼 @lyfi2003 是啊,你的方案是选择困难症患者的良药。

个人感觉,对于新手来说,也许很有帮助,对于老手来说,可能毫无帮助,但是无论对谁来说,思路是非常赞的,做项目的,每次新项目都重复一些东西,完全可以按照楼主的思路沉淀出适合自己的一个启动模板来,应该是很有帮助的,不过感觉还可以多一些东西,如果项目模式固定的话,比如针对 Bootstrap Admin 模板类型项目的话,还可以准备一些 Scaffold 模板

#38 楼 @pzgz 恰恰相反,这个模板是为非初级工程师设定的。当然可以依靠这个思路搞自己的项目模板。但 rails-template 的目的就是选择一套 "最好" 的组件。避免选择症。所以选择 gem 会仔细考虑:

  1. 非常必须的 gem 才会被考虑
  2. 有类似选择时选择尽可能简单易懂的那一个
  3. 最多应用的

换言之,它很 "固执", 但够快速,有时候会强推作者的经验,会有偏见。但绝不坑你。更适合中级工程师想进一步改进项目构建之用。我觉得是符合 rails 的一贯思想的中国开发者版。

#39 楼 @lyfi2003

"最好"二字太过牵强,当然你要一定这么认为也是你的自由,只是我个人感觉,你给你的这个模板,冠上了太多的个人感觉而已

#40 楼 @pzgz 是的,所以我在一开头就说它是 "固执" 的。正如 @martin91 所说,rails-template 是选择困难症患者的良药。我觉得没必要在这里纠结这个高大上的 "思想". 如果有好的 gem 方案集成建议,我们为何不探讨技术呢?

@lyfi2003 固执没错。另外 rails 5 的 api 开发,会比 grape 舒服?

#42 楼 @seaify 看起来还不够完善。不过很轻。

不错,我回来试试

分享一个我们 80% 团队使用的 rails 模板

看成了 80% 的团队使用的 rails 模板 吓一跳..

老道 还是 老到?

postgres 不会用,web 服务器我选 unicorn,看来是合不到一起了……

好好好。。。

用户系统考虑把 clearance 加上吗,thoughtbot 出品,相比 devise 轻多了。

#49 楼 @hww 好主意,考虑中: clearance issue

好兴奋。。。5.0 来了。。

slim 模板的开发效率真的很高吗?

刚开始我也觉得 slim 的代码非常精干,严格的缩进排版能迫使程序员认真对待每一行 HTML 代码。不过在一个项目开发过程中,因为对 js.slim 中的 js 代码的混合写法实在搞不定,最终还是把所有代码都替换成了 erb 模板。

现在感觉还是 erb 要舒服很多,而且网上绝大多数样例都是 erb 的。

#52 楼 @samport Slim 很多时候是对 HTML 编写的过度折腾。

#52 楼 @samport #53 楼 @ashchan 明显是高的,slim 让你少码很多无效代码就够了。反过来说,混写 html 与 js 是个 bad smell 的事情,避免掉,如果实在避免不了,那就当前文件用 erb, 混用 slim 与 erb 不是什么问题。

说下我的看法,devise 和 simple_form 依然需要 devise:@lyfi2003 你说的缺点固然有,但是用户系统对任何一个完整应用几乎是必备,除非你能找到一个更合适的替代,另外你说的国内用户较少,可能也未必吧,写代码的有几个不会翻墙,连这点信息都获取不到真不如改行. simple_form 这个大家已经说明 另外 slim 这个东西我真心不喜欢,通用性就是个大问题,唯一的好处就是熟悉之后你自己看着舒服而已,仅仅是你自己,当你整合其他代码的时候会导入一堆问题,而且这些问题还必须转成 slim 格式的文件你才能去 debug.除非哪一天它成为官方标配,否则,还是算了吧。等哪天你想 rollback 的时候,一堆 slim 文件要改,你会后悔无比。

#54 楼 @lyfi2003

明显是高的

这个见仁见智,我用 Rails 近十年,ERB,Slim 和 Haml 的项目都经历过不少。实话说,我个人完全不觉得另外两个在编码效率上有过人之处。到是维护升级和解决一些额外的小毛病上会浪费时间。

@lyfi2003 问下那个项目的权限管理你打算用什么 gem 啊,还有一个小建议,那个 gemfile 中的 gem 能不能加个备注啊,我觉得这样一般阅读比较好

#56 楼 @ashchan

我的感觉是这样的

  1. 如果从 0 开始写 slim,如果非常熟悉,那么肯定比 erb 快,少些很多 div,而且 slim 有空白字符压缩的功能
  2. 如果通过前端写好了的 html 模版再转换成 slim 就有点多事了,还是用 erb 简单省事。

#58 楼 @small_fish__ 加快编写速度可以用 Zen Coding;直接拿现成的 HTML 来改的情况还是非常多的:

  • 设计师提供的原始 HTML
  • 购买的 Theme
  • 设计软件生成的 HTML
  • 从 CSS 框架拷贝来的 HTML 样例

关键的一点,这是一层而外转换,需要 team 去学习一种额外的语法。如果项目中的设计师和开发者人来人往,就是额外的开销。

#59 楼 @ashchan 认同

我现在的情况是自己一个人能搞定,就 slim, 如果有你说的情况,就 erb 了

谢谢,fork 之去掉 upyun 😸

#61 楼 @debugger 可一并去掉 application.ymlapplication.yml.example 中的配置与 config/initializers 中的即可 :)

#57 楼 @perect 你可以选择集成 cancancanpundit. 看自己需求。关于你提的加注释的方式,我倒觉得有时间把 wiki 完善一下更好更清晰。已经列在 README 的 TODOLIST 里了。

#55 楼 @qx devise 不会集成,已经考虑过了。 simple_form 早就集成了,不多说了。至于 slim 是见人见智的事,不再调整了。@ashchan 谢谢你的经验分享。

figaro vs dotenv

#64 楼 @alvin2ye 两个差不多,相对来说, figaro 更安全。rails-template 集成的方式更安全。

#65 楼 @lyfi2003

  1. 什么叫做 "rails-template 集成的方式", 怎么定义?
  2. dotenv 为什么会造成"rails-template 集成的方式" 的安全问题,具体体现在哪里?

#66 楼 @alvin2ye 对于配置文件,安全仅有一点:不要提交任何敏感信息到服务端。所以 rails-template 是添加了一个 config/application.yml.example, 随后由开发者自行复制一份为 config/application.yml, 而此文件在 git 中是忽略的。这是 rails-template 的集成方式。

在不同的生产环境,config/application.yml 由发布者在 mina setup 时自行配置即可。rails-template 在随后的发布过程自动软链接它,保证每次新的发布使用同一份配置。简明清晰的流程。

dotenv 建议开发者提交一些配置到 .env, 和提交 .env.production 之类的,不是配置的最安全做法,只要你提交过敏感,一旦源代码泄漏,就有黑客能轻易攻击你。所以我说安全性会降低。我在上述的解决方式中是一种简明清楚的手段。这也是很多开源项目类似的手法,例如 ruby-china.

相对来说,我会选择简明,安全的手法去集成。于是使用了 figaro

#67 楼 @lyfi2003

我明白你的意思了。

但这个和 dotenv 无关。我也不觉得作者的意思是让你提交敏感信息在 .env.production 中,你同样可以有个 .env.production.example. 这个和哪个 Gem 安全无关。

devise 和 simple_form 这两个东西,我个人不喜欢。 devise 因为复杂度,可能会带来问题,导致学习成本升高。 simple_form 的那些伎俩程序员完全可以用自己的方式自己实现下,写在 helpers 中。

#69 楼 @gazeldx 嗯,基本同意,但 simple_form 替换成本很低,很适合写后台用,所以还是可以接受的。

#67 楼 @lyfi2003 dotenv 明明在首页清楚地写道:

Credentials should only be accessible on the machines that need access to them. Never commit sensitive information to a repository that is not needed by every development machine and server.

简单翻译

凭证应当遵循“谁访问,谁存储”的原则。永远不要将并非开发所需要的敏感信息提交到代码仓库中。

怎么在你口中就成了:

dotenv 建议开发者提交一些配置到 .env, 和提交 .env.production 之类的,不是配置的最安全做法,只要你提交过敏感,一旦源代码泄漏,就有黑客能轻易攻击你。所以我说安全性会降低。

我就是遵循 dotenv 的建议,将敏感信息存储在部署服务器上,将非敏感信息提交到代码库。你自己实践方式不对,却说作者建议你把.env.production 提交到仓库,这样不妥吧?

#22 楼 @lyfi2003 不是太明白是什么意思,能够解释一下?谢谢

#50 楼 @lyfi2003 用过 clearance,出发点是好,不过随着需求的变化(需求变多),后来发现 devise 大多时候还是比较合适,而且网上资源很丰富。

@lyfi2003 顺便问一下 minitest 是否还保留着,我现在更加喜欢 minitest 来写测试。基本上能用 Rails 自带的就不选其他的。之前也是 slim 的粉丝,让设计都学会了 slim,现在我还是用 erb 了。

#72 楼 @sefier 你怎么实践都可以。我这里采用 figaro 达成一样的效果即可。而且布署时也提供了最佳实践. #75 楼 @grantbb 这里只提供一种 rspec 测试方案,不适合就不要选了。建议用 rails5 自带的生成器,已经很符合你的口味了~

77 Floor has deleted

#34 楼 @nouse

nouse: 人之宝石,我之垃圾。

有大量的外包团队每天都在写重复的内容,这个模板可以减少很多工作量,节省大量的前期工作。对你没用,不发表评论就可以了,为什么要说 垃圾 呢。你总是通过惊世骇俗的观点来刷存在感吗?

动不动就说别人遇到的问题简单,一堆反问句质问别人,嘲笑别人的英语。

  1. 这不是常见面试题吗?最傻的办法得出结果以后循环一下都不会吗?
  2. 问题来了,为什么用 Ruby 做 ETL?
  3. @helperhaps "Jiguang Push"好典型的中国式英语
  4. 说 Rails 是理念的,这理念至少落后 5 年了

你技术实力也很硬,不如像 nightire 多分享一些内容,少一些吐槽。社区缺的是建设者,而不是评论家。

bootstrap fontawesome 之类的东西我还是比较喜欢手动引入。

感谢楼主的分享,fork 后做了如下改动:

  1. 可以选择使用 rspec 或者 minitest
  2. 可以选择是否使用 simple_form
  3. 把 upyun 改成了七牛
  4. 加入了 pry, better_errors 和 rack-mini-profiler gem

喜欢的拿走,不谢! 创建应用: rails new myapp -m https://raw.github.com/bingxie/rails-template/master/composer.rb

github 地址: https://github.com/bingxie/rails-template

使用 @lyfi2003 的脚本创建项目后,rails s 运行会出错。我使用的 vagrant,ubuntu 64 位 16.04,ruby 2.3.1,rails 5.0.0 应该是 minitest 的问题,我已经参考网上说的,在 Gemfile 中添加了 require 'minitest',在错误的 rb 文件中,添加了 require 'minitest/autorun'等等的方法,但是还是会出错。不知道问题在哪里。

/home/ubuntu/.rvm/gems/ruby-2.3.1/gems/activesupport-5.0.0/lib/active_support/test_case.rb:16:in <module:ActiveSupport>': uninitialized constant Minitest (NameError) from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/activesupport-5.0.0/lib/active_support/test_case.rb:15:in' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/test_unit/railtie.rb:17:in block in <class:TestUnitRailtie>' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:30:ininstance_exec' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:30:in run' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:55:inblock in run_initializers' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:228:in block in tsort_each' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:350:inblock (2 levels) in each_strongly_connected_component' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:431:in each_strongly_connected_component_from' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:349:inblock in each_strongly_connected_component' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in each' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:incall' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in each_strongly_connected_component' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:226:intsort_each' from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:205:in tsort_each' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:54:inrun_initializers' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/application.rb:352:in initialize!' from /home/ubuntu/rails_project/test11/config/environment.rb:5:in' from /home/ubuntu/rails_project/test11/config.ru:3:in require_relative' from /home/ubuntu/rails_project/test11/config.ru:3:inblock in ' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:55:in instance_eval' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:55:ininitialize' from /home/ubuntu/rails_project/test11/config.ru:in new' from /home/ubuntu/rails_project/test11/config.ru:in' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:49:in eval' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:49:innew_from_string' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:40:in parse_file' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/server.rb:318:inbuild_app_and_options_from_config' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/server.rb:218:in app' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/server.rb:59:inapp' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/server.rb:353:in wrapped_app' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/server.rb:124:inlog_to_stdout' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/server.rb:77:in start' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:90:inblock in server' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:85:in tap' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:85:inserver' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:49:in run_command!' from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands.rb:18:in' from bin/rails:4:in require' from bin/rails:4:in'

@lyfi2003 楼主能教我们如何自己写模板吗?

@peter 可以参考一下项目里的 composer.rb

86 Floor has deleted
87 Floor has deleted

我觉得 postgres 不如 mysql 在国内应用的广

https://www.80percent.io/sidekiq 哈哈,sidekiq 地址默认了。。。

You need to Sign in before reply, if you don't have an account, please Sign up first.