Stories

Detail Return Return

前端學 Ruby:熟悉Rails - Stories Detail

前言

一句話介紹,看 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結構

當用户通過瀏覽器輸入網站地址時,可以理解為訪問了網站服務器,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 語法
user avatar blbl-blog Avatar ayuan01 Avatar banana_god Avatar jiavan Avatar evenboy Avatar assassin Avatar romanticcrystal Avatar lin494910940 Avatar yulong1992 Avatar it1042290135 Avatar xw-01 Avatar licin Avatar
Favorites 63 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.