重返Ruby之路Day23 ---homeland项目学习

481 阅读5分钟

准备工作:

数据库关系图

生成ERD: 安装 rails-erd Gemfile:

gem 'rails-erd', group: :development

brew install graphviz

生成ERD图:

bundle exec erd

执行成功会在当前项目下生成名为 'erd.pdf'的文件。 大部分rails项目先从了解其ERD图开始: image.png

启动数据库服务

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 ruby​​gem 的翻译。

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 模型、路由、固定装置和其他。