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

lyfi2003 for 深圳市百分之八十网络技术有限公司 · 2016年06月29日 · 最后由 plugine 回复于 2016年08月20日 · 13941 次阅读
本帖已被设为精华帖!

如何极速构建一个新的 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 将本帖设为了精华贴 06月30日 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楼 已删除

赞,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 轻多了。

好兴奋。。。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楼 已删除

#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楼 已删除
87楼 已删除

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

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

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