准备工作:
数据库关系图
生成ERD: 安装 rails-erd Gemfile:
gem 'rails-erd', group: :development
brew install graphviz
生成ERD图:
bundle exec erd
执行成功会在当前项目下生成名为 'erd.pdf'的文件。
大部分rails项目先从了解其ERD图开始:
启动数据库服务
Homeland 用到了 PostgreSQL 和 Redis 数据库,使用 docker-compose.yml 快速创建数据库服务。
文件路径:homeland_db/docker-compose.yml
## 使用 docker 进行容器编排,启动数据库服务。
version: '3'
services:
postgres:
image: postgres:11
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
volumes:
- ./data:/var/lib/postgresql/data
redis:
image: redis:5
ports:
- 6379:6379
修改数据库连接配置 homeland/config/database.yml
default: &default
adapter: postgresql
pool: <%= ENV["DATABASE_POOL"] || 64 %>
username: postgres
password: postgres
port: 5432
host: 127.0.0.1
timeout: 5000
encoding: utf-8
development:
<<: *default
database: homeland-dev
test:
<<: *default
database: homeland-test
production:
<<: *default
database: homeland-prod
修改 config/redis.yml
defaults: &defaults
url: <%= ENV["REDIS_URL"] || "redis://127.0.0.1:6379/1" %>
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
启动准备工作:
cd homeland_db
docker-compose up -d
cd ../homeland
yarn install
bundle install
rails db:create
rails db:migrate
rails db:seed
为 Homeland 的模型添加注释
我们可以使用 annotate为所有的 model 添加类似下面的注释
# frozen_string_literal: true
# == Schema Information
#
# Table name: topics
#
# id :integer not null, primary key
# user_id :integer not null
# node_id :integer not null
# title :string not null
# body :text not null
# last_reply_id :integer
# last_reply_user_id :integer
# last_reply_user_login :string
# who_deleted :string
# last_active_mark :integer
# lock_node :boolean default(FALSE)
# suggested_at :datetime
# grade :integer default("normal")
# replied_at :datetime
# replies_count :integer default(0), not null
# likes_count :integer default(0)
# mentioned_user_ids :integer default([]), is an Array
# deleted_at :datetime
# created_at :datetime
# updated_at :datetime
# closed_at :datetime
# team_id :integer
#
class Topic < ApplicationRecord
...
end
安装
bundle exec annotate --models
使用
group :development do
gem 'annotate'
end
Gemfile 文件功能大致讲解
Homeland 使用了很多 Gem,我们简单介绍下这些 Gem 的主要功能,具体如何使用,这些 Gem 的官网都详细的的说明。
git_source(:github) { |repo_name| "git@github.com:#{repo_name}.git" }
用户从 github 上直接加载 gem,例如
gem "exception_notification", github: "zlei1/exception_notification"
也可以写成
gem "exception_notification", git: "git@github.com:zlei1/exception_notification"
当有多个 gem 需要从源码加载时,这种方式比较方案。
gem "jbuilder"
提供了一个简单的 DSL,用于声明 JSON 结构,用于构建接口服务。
gem "rails"
指定 rails 版本,当某个 gem 不指定版本时,会基于当前 Gemfile 其他 gem 的依赖情况推算出最终可用的版本。
gem "rails_autolink"
观察下面的示例就知道这个 gem 的用处了
require 'rails_autolink'
auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com")
## => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> and
## say hello to <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"
gem "sass-rails"
为 Ruby on Rails 项目与 Sass 样式表语言提供了官方集成。
gem "turbolinks"
获得单页应用程序的性能优势,而不会增加客户端 JavaScript 框架的复杂性。
gem "uglifier"
UglifyJS JavaScript 压缩器的 Ruby 包装器。UglifyJS 仅适用于 ES5。
gem "webpacker", "6.0.0.rc.6"
在 Rails 中使用 Webpack 管理类似应用程序的 JavaScript 模块。
gem "view_component"
用于在 Ruby on Rails 中构建可重用、可测试和封装的视图组件的框架。
gem "pg"
用于 Ruby 的 PostgreSQL 客户端库
gem "devise"
带有 Warden 的 Rails 的灵活身份验证解决方案
gem "devise-encryptable"
Devise 上加盐加密器的加密解决方案
gem "cancancan"
Rails 的简单授权解决方案。所有权限都存储在一个位置。
gem "doorkeeper"
Doorkeeper 是 Rails 和 Grape 的 OAuth 2 提供商。
gem "doorkeeper-i18n"
doorkeeper rubygem 的翻译。
gem "omniauth"
gem "omniauth-github"
gem "omniauth-twitter"
gem "omniauth-wechat-oauth2"
gem "omniauth-rails_csrf_protection"
用于多提供商身份验证的通用 Rack 框架。
gem "jieba-rb"
cppjieba 绑定 ruby
gem "dotenv-rails"
在 Rails 中自动加载 dotenv。
gem "rack-attack"
用于限制和阻止滥用请求的 rack 中间件
gem "http_accept_language"
通过阅读他们在浏览器中指定的语言,找出用户喜欢的语言环境
gem "rails-i18n"
一组通用的语言环境数据和翻译,用于国际化和/或本地化 Rails 应用程序。
gem "twemoji"
将 :heart: 转换为 Twitter cdn url 的 RubyGem
## Uploader
gem "carrierwave"
## Aliyun / Upyun / Qiniu
gem "carrierwave-aliyun"
gem "carrierwave-upyun"
gem "carrierwave-qiniu"
gem "qiniu"
文件上传相关的 RubyGem。
gem "mini_magick", require: false
通过 ImageMagick / GraphicsMagick 以最少的内存使用操作图像
## Captcha
gem "rucaptcha" #这是 Rails 应用程序的 Captcha gem。它使用 C 代码绘制验证码图像,因此没有依赖性。
gem "recaptcha" #reCAPTCHA API 的助手 gem。
## Notification
gem "notifications" ## 任用程序的 Rails 可安装通知。
gem "ruby-push-notifications" #易于使用的 gem 发送 iOS、Android 和 Windows Phone 推送通知
gem "action-store"
通过 ActiveRecord 多态关联将不同类型的操作(Like、Follow、Star、Block ...)存储在一张表中。
gem "kaminari"
gem "form-select"
gem "enumize"
form 操作相关
gem "pghero"
Postgres 的性能仪表板
gem "exception-track"
Rails 应用程序的跟踪异常通过 exception_notification gem 将它们存储在数据库中。
## https://github.com/smartinez87/exception_notification/pull/519
gem "exception_notification", github: "zlei1/exception_notification"
Rails 应用程序的异常通知
后续 Gem 可以去 gems.ruby-china.com/ 搜索查看。
## Cache
gem "redis"
gem "redis-namespace"
gem "second_level_cache"
受 Cache Money 和 cache_fu 启发的直写和直读缓存库,支持 ActiveRecord 4、ActiveRecord 5 和 ActiveRecord 6。
直读:按 ID 查询,例如current_user.articles.find(params[:id]),将首先在缓存存储中查找,然后在数据库中查找该查询的结果。如果缓存未命中,它将填充缓存。
直写:在创建、更新和删除对象时,所有缓存都会自动保持最新和一致。
## Setting
gem "rails-settings-cached"
在 Rails 应用程序中存储全局设置的最佳解决方案。这个 gem 将很容易管理一个全局键值对表。可以把它看作是存储在数据库中的全局 Hash,它使用类似 ActiveRecord 的简单方法进行操作。你可以存储任何类型的对象。字符串、数字、数组或任何对象。
## HTML Pipeline
gem "auto-correct"
gem "html-pipeline"
gem "html-pipeline-auto-correct"
gem "redcarpet"
gem "rouge"
HTML 处理过滤器和实用程序。该模块包括一个小框架,用于定义基于 DOM 的内容过滤器并将它们应用于用户提供的内容。
gem "sidekiq"
gem "sidekiq-cron"
简单、高效的 Ruby 后台处理。 Sidekiq 使用线程在同一进程中同时处理多个作业。它不需要 Rails,但会与 Rails 紧密集成,使后台处理变得非常简单。
gem "social-share-button"
社交分享按钮,支持:Facebook 推特 豆瓣 微博 QQ空间 谷歌书签 Delicious Tumblr Pinterest 电子邮件 领英 微信(微信) 联系方式 Odnoklassniki Xing Reddit Hacker News 电报 WhatsApp
## Mailer Service
gem "postmark"
gem "postmark-rails"
允许您以高递送率发送电子邮件。它还包括详细的统计数据。此外,Postmark 可以解析传入的电子邮件,这些电子邮件会转发回您的应用程序。
gem "puma"
是用于 Ruby/Rack 应用程序的简单、快速、线程化和高度并行的 HTTP 1.1 服务器。Puma 旨在用于开发和生产环境。它非常适合高度并行的 Ruby 实现,例如 Rubinius 和 JRuby,以及提供进程工作者支持以很好地支持 CRuby。
## API cors
gem "rack-cors", require: "rack/cors"
使基于 Rack 的应用程序与 CORS 兼容的中间件。
gem "bootsnap"
Bootsnap 是一个插入 Ruby 的库,可选择支持 、YAML、 优化和缓存昂贵的计算
gem "puma_worker_killer"
在你使用这个gem之前,要知道它是危险的。如果您有内存问题,则需要解决该问题。这个gem背后的最初想法是,它将充当临时创可贴,为您争取时间,让您解决问题。如果您打开它并且不修复潜在的内存问题,那么随着时间的推移,事情只会变得更糟。
这个gem也可以让你的表现变得更糟。当一个工作人员被杀死并返回时,它需要 CPU 周期和时间。如果你经常重启你的工人,那么你就是在扼杀你的表现。
group :development do
gem "spring"
gem "byebug"
gem "letter_opener"
gem "derailed_benchmarks"
end
group :development, :test do
gem "listen"
gem "mocha"
gem "minitest-spec-rails"
gem "factory_bot_rails"
gem "standard"
end
gem 'tzinfo'
TZInfo是一个 Ruby 库,它提供对时区数据的访问,并允许使用时区规则转换时间。
gem 'rails-erd', group: :development
为您的 Rails 模型自动生成实体关系图 (ERD)。
group :development do
gem 'annotate'
end
根据数据库模式注释 Rails/ActiveRecord 模型、路由、固定装置和其他。