前言
一句话介绍,看 Rails Guides 即可
注释
Rails 是应用 Ruby 语言编写的 Web 利用开发框架,如同 Node 中的 Express、Koa,Python 中的 Django、Flash。但相比其余,它更弱小
Rails 哲学蕴含两大指导思想:
- 不要自我反复(DRY)
- 多约定,少配置(约定优于配置)
因为它约定优于配置的设计,从而能够使 Rails 利用简直不须要任何配置文件。有人已经这样比喻过,Rails 框架好像一台傻瓜相机,只须要简略练习就能够照出相片,但意味着摄影者齐全置信相机的设定。笔者也是这么认为的,所谓数码(单反或无反)相机,大多数爱好者也只是用自动挡,还不如用手机或者傻瓜相机拍的好
Rails 中的 MVC
Rails 能讲的货色太多了,MVC 思维,严格的分层实践,ORM 机制,页面模板技术,页面装璜技术……
笔者这里做笔记时摘要其中最重要 MVC 思维,MVC 不必过多介绍,即模型、视图、控制器
- 模型 Model:对数据库的数据进行操作
- 视图 View:显示数据
- 控制器 Controller:调度模型,将数据展现给视图
咱们已经在 从 url 输出到返回申请的过程 一文中介绍过申请的全过程,当用户申请到服务器时,Rails 是怎么做的,它通过 Routing 承受所有的申请,如果匹配到,进入相应控制器,而后再控制器中执行其中的代码,一般来说,是控制器操作 Model 数据,拿到数据后,返回给 View
整个 Rails web 利用正如上面这幅图所示:
当用户通过浏览器输出网站地址时,能够了解为拜访了网站服务器,Rails 框架的入口会来路由处匹配 url。如果匹配正确,返回对应的控制器(Controller)处,控制器中咱们能够定义方法,办法中去操作模型(Modal),因为模型是继承 ActiveRecord 类,它能提供你对数据库进行增删改查,当控制器拿到数据后以视图模式展现,当然,也能够是以 json 模式返回。如果是以视图模式返回,视图通过特定语法(<%= %>)展现数据
例如,咱们要拜访一个书的列表页
class BooksController < ApplicationController
def index
@books = Book.all
end
end
其中,BooksController 就是咱们的控制器,在类中定义 index 办法,办法中的 Book 即继承 ActiveRecord 后的 Book Model 模型,Book.all 即查问数据(Model)中所有的书,index 办法名对应的时 views/books/index.html.erb
,而 @books
以通过模型查问到的数据体现在视图上
上述讲到的内容是任何 Web 框架中都进行的事件,不过,Rails 将其全整合了,我全都有,你用就好
Model(模型)⭐
相干文档
在整个 MVC 中,笔者感觉最难的当属 Model,Rails 的 Model 是基于 ActiveRecord,ActiveRecord 就是一个 ORM(对象关系映射)工具。它的作用就是数据库的高级封装、简略说就是不应用 SQL 语句就能够操作数据库
数据库表就是一个类,行记录就是实例对象,字段就是对象的属性
- 数据库 -ActiveRecord- 例子
- 表 - 类 -articles
- 行 - 实例对象 -
obj={id:1, title:'题目', desc: '形容'}
- 字段 - 对象属性 -
obj.title
这里须要留神的是:Rails 中的模型类名是复数,查找的数据表为复数。例如模型类名为 Article,数据表是 articles
理论中的基本操作
rails generate model user userName:string email:string # 创立 user 模型,模型为 user,数据库中会以 users 展现
rails console # 进入命令行控制台
# 创立
@user = User.new(userName => 'johan', email => 'johan101@.qq.com')
@user.save
# 还有一种是 create,创立记录,并存在数据库
@user = User.create(userName => 'johan', email => 'johan101@.qq.com')
# 读取
# 获取所有的用户
users = User.all
# 返回第一个用户
user = User.first
# 返回第一个名为 johan 的用户
johan = User.find_by(name: 'johan')
# 更新
user = User.find_by(name: 'johan')
user.name = 'elaine'
user.save
# 或者是间接用关键字 update
user.update(name: 'elaine')
# 删除
# 删除所有用户
User.destroy_all
# 删除名为 johan 的用户
user = User.find_by(name: 'johan')
user.destroy
# 其余
# find(*args):依据主键查问特定记录
# find_by_sql(sql):依据 SQL 语句查问
# exists?(id):判断指定 ID 的记录是否存在
# create(attributes):新增一条记录
# update(id, attributes):依据 ID 来批改指定记录
# update_all(updates, conditions):依据条件来批改一批记录
数据验证
在存入数据前,后端要对数据进行判断,如果你什么都没填就提交了,那不是乱搞吗,所以个别都要对传入的值进行判断,是否为空,字符太少,要求是手机号码、身份证、各种正则 …
在 Rails 中,在 Model 就提供了相干的办法
class User < ApplicationRecord
validates :name, presence: true, length: {minimum: 2} # 不能为空,长度起码是 2 个字符
validates :email, presence: true, length: {maximun: 255}, format: {with: EMAIL}, uniqueness: {case_sensitive: false}, on: :create # 创立的时候该数据是惟一的
end
相干文档,要害还是要看文档,内容太多了
回调(生命周期)
在创立、保留、更新、删除、验证或从数据库中加载 Active Record 对象时执行的代码
class User < ApplicationRecord
validates :login, :email, presence: true
before_validation :ensure_login_has_a_value
private
def ensure_login_has_a_value
if login.nil?
self.login = email unless email.blank?
end
end
end
可用的回调包含:before_validation、before_create、after_create、after_save、before_save、after_update、before_destroy、after_destroy 等等
具体可看文档
迁徙
# 生成迁徙文件
rails g migration CreateJoinTableCustomerProduct customer product
# 迁徙
rails db:migrate
# 版本回滚
rails db:rollback step=1
这里在学习的时候,遇到一个货色,困惑了半天,那就是外键,外键用于两个表之间一对多关系。一个用户能写多篇文章,所以 article model belongs_to,而 user model has_many。
关联
关联的类型有六种:belongs_to、has_one、has_many、has_many :through、has_one :through、has_and_belongs_to_many
has_many 与 belongs_to 是什么意思?
has_many 领有很多
belongs_to 属于
例如,一篇文章能够领有很多评论,一则评论属于某篇文章
View(视图)
相干文档
视图绝对简略,这里提几个笔者在开发时遇到的坑定:
LInk_to 的用法
<h1><%= @article.title %></h1>
<%= image_tag @article.cover_image.url %>
<p><%= @article.content %></p>
<%= link_to "Edit", edit_article_path(@article) if Current.user.admin? %>
Controller(控制器)
相干文档
个别应用命令行不仅能生成控制器,也能把视图生成进去
rails g controller Calendar show
没啥好讲的
Route(路由)
相干文档
Rails.application.routes.draw do
resources :articles do # /articles, /articles/1
resources :comments # /articles/1/comments, /comments/1
member do
post 'like'
delete 'unlike'
end
end
resouce :settings, only: [:show, :update] # 复数模式
scope :profiles do
get ':username', to: 'profiles#show', as: :user_profile
post ':username/follow', to: 'profiles#follow', as: :follow_user
delete ':username/follow', to: 'profiles#unfollow', as: :unfollow_user
end
get ':welcome', to: 'welcome#show' # GET /welcome
root to: "articles#index" # 根目录
end
增加资源路由扩大
Rails.application.routes.draw do
resources :post do
get 'recent', :on => :collection
end
# 或者
resources :post do
collection do
get 'recent'
end
end
end
成员路由
Rails.application.routes.draw do
resources :post do
member do
get 'recent'
end
end
end
Rails 命令行⭐
有些命令在 Rails 开发过程中常常会用到,上面依照应用频率倒序列出:
rails console
,简写rails c
rails server
,简写rails s
bin/rails
rails generate
,简写rails g
rails dbconsole
rails new app_name
rails destroy
,简写rails d
创立一个我的项目
rails new myapp
rails new blog # 生成一个 blog 我的项目
rails new --api blog # 以 API 模式生成一 blog 我的项目
rails new -h # 查看所有命令行选项
rails new --api --database=postgresql --skip-test app # 创立一个数据库为 postgresql 的跳过测试的 api App 我的项目
启动 puma Web 服务
rails server
bin/rails server -e production -p 4000 # -e 环境 -p 端口
应用模板生成
rails g model user email:string name:string # 创立 user 模型
rails g controller welcome hello # 生成 welcome 控制器,hello 函数
rails destroy controller welcome # 销毁 welcome 控制器所有配套的文件
rails g scaffold article title:string description:string body:text # 生成文章脚手架,视图、控制器、模型都生成
rails db:migrate # 同步到数据库
rails db:rollback step=1 #反悔命令 step 步骤
rails g migration AddUserGenderToUser gender:string # 批改数据库
# migration 基于的是 ActiveRecord::Migration
应用命令行与 rails 交互
rails console
rails c
各个罕用 gem
以下是我收集的各种 gem 包,当然,能够去 https://www.ruby-toolbox.com/ 去找
devise:用来做用户体系⭐
simple_form:表单提交⭐
PostgreSQL:数据库⭐
kaminari:分页⭐
Webpacker:前端资源打包
Tailwind:CSS 库
Pagy:分页
jwt:jwt
pg_search/searchkick:全文搜寻
rspec-rails:测试
rspec_api_documentation:测试生成文档
Rubocop:代码格局
Clockwork:定期作业
Sidekiq:后台作业
friendly_id:生成 URL 敌对的 slug
InfluxDB、Grafana、influxdb-rails:监控
Solargraph,ruby-rubocop:编辑工具
Rollbar 或 Honeybadger:异样治理
Postmark:发送电子邮件
activeadmin:管理工具
参考资料
- Ruby 官网 rails 教程
- Rails 格调指南
- Rails 格调指南中文版
系列文章
- 前端学 Ruby:前言
- 前端学 Ruby:装置 Ruby、Rails
- 前端学 Ruby:相熟 Ruby 语法