# Ruby(07/14) 五倍紅寶石(第八屆共筆)(2021/8/12)
## Active Record
Active Record 是一個模組,裡面放了大量的類別跟方法給我們用。
只要需要變動到資料庫資料的時候,基本上都是使用 Active Record 來操作。
Model = Active Record 設計出來的產物。
Model 會把從資料表的每筆資料包裝成一個物件讓我們使用。
透過第一篇基礎篇可以知道哪些方法是使用 ORM 技巧,非常實用。
第二篇關聯篇提到很多細節。
[Rails Guide:Active Record 基礎](https://rails.ruby.tw/active_record_basics.html)
[Rails Guide:Active Record 關聯](https://guides.rubyonrails.org/active_record_querying.html)
## evernote 專案
form_for 偷偷用了.persisted 這個方法來判斷內容物有沒有料,會回傳布林值,
如果沒料就判斷你是想新增東西,所以會走到 new,
如果有料就判斷你是想修改東西,所以會走到 edit。
[robots.txt](https://zh.wikipedia.org/wiki/Robots.txt)
用途:寫給爬蟲看的,給爬蟲取得你網址的許可權。
### 前端技術,想走前端的可學
- SPA = Single Page Application
- SSR = Server-Side Render(ing)
在點超連結時 Rails 其實不會換頁,只是看起來換頁而已。
- turbolinks:
在背後偷偷撈資料,有自己的事件,非HTML 的 DOMContentLoaded。
他有加監聽器,用非同步抓別的頁面的資料,把自己這邊的 body 換掉,也會把網址改掉,假裝有換頁,所以換頁時看起來會很順。
Ajax:應用在 google map,點擊滑鼠拖拉,放開後會即時載入地圖資訊。
[Rails Turbolinks™ 5 深度研究](https://www.writershelf.com/article/rails-turbolinks%E2%84%A2-5-%E6%B7%B1%E5%BA%A6%E7%A0%94%E7%A9%B6?locale=zh-TW)
### prettier
在專案內新增 .prettierrc 檔案。
用 {} 包起來,裡面可做個人化。
細節設定可參考這篇,[導入 Prettier](https://ithelp.ithome.com.tw/articles/10205684)
### I18n
讓你的網站國際化,根據不同的使用者直接採用不同的語言、數字格式、日期格式等。
[rails i18n](https://guides.rubyonrails.org/i18n.html)
命名:i跟n之間有18個字,如果名字太長的都可以這樣用,
像全台名字最長的可以叫陳48魚、高1龍、五3石,以此類推。
K8s:用在網站部屬與維護。
### partial render、render collection
- partial render:局部渲染
檔名要記得以 _ 開頭!
- render collection:高級黑魔法,大概是 Sectumsempra 撕淌三步殺等級的,之前用的只是去去武器走等級。
要符合很多東西才能用,要看得懂但不一定要用。
可簡寫成 <% = render @notes %>
[Layouts and Rendering in Rails](https://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables)
### rails g scaffold
利用鷹架開外掛馬上建好 CRUD 功能。
## Database
### 簡介
資料庫會有很多資料表,可以做複雜的查詢,交叉比對,類似 excel ,只不過是複雜版的。
### SQL Structured Query Language 結構化查詢語言
是一種 domain-specific language 特定領域的語言,只專注在資料庫上。
RDBMS:**關聯式**資料管理系統,重點是資料之間的關聯。
SQL92共識:一種資料庫的標準,定義一個統一的語法給大家使用,但各家資料庫操作上還是會有些許不同。
sqlite 因為輕便,可以用單一檔案形式存在,不像其他資料庫都是使用伺服器來操作。
MySQL 資料庫伺服器位置:3306
一個伺服器裡面有很多資料表
Model 是一個翻譯官,我們跟 Model 講 Ruby 話,Model 跟伺服器講 SQL 話。
### 基本知識
id 是流水編號,會一直遞增,不會去補之前的號碼。
#### 資料型態
- CHAR/VARCHAR(VARiable CHARacter)/TEXT:文字,可設定上限
ex:CHAR(10) = 限 10 個字
如果寫入的資料長度超過他原本設定的會寫入失敗
- CHARS:實實在在佔滿格子,用不完的會填空白,只有一格用這個會比較省
- VARCHARS:可變動的,會再額外用1個byte存長度
在 Rails 都會轉成 VARCHAR
- INT = INTEGER:整數
- DECIMAL/FLOAT:小數
- BLOB(Binary Large Object):放二進位類型的東西,什麼都可以放
如果要放圖片的話放路徑就好,不然查詢時記憶體會被佔掉
- DATE/DATETIME:日期
#### 語法
; 代表我寫到這邊結束,中間就算換行也算是同一個指令,當遇到 ; 才算結尾。
建立資料庫:
- create database name;
= rails db:create
刪除資料庫:
- drop database name;
選取資料:
- SELECT * FROM WHERE(...)
#### SQLITE3
- NN:Not Null
欄位填入資料時不能是空值。
- PK:Primary Key
主鍵用來保證欄位在資料表中的唯一性,主鍵欄位中的每一筆資料在資料表中都必需是獨一無二的。
- AI:Auto Increment
自動遞增,常用來做 ID 、流水編號。
- U:Unique
值不能跟其他筆資料重複,ex:帳號不可重複。
#### 驗證
寫在:
- model:好操作,噴錯用 Rails 處理就好
- database:比較保險,就算沒有 Model 保護也沒關係,但 SQL 語法相對比較不好操作。
## evernote 專案內容
application_controller.rb
```rb
class ApplicationController < ActionController::Base
# 讓所有controller 都可以自動用rescue_from這個類別方法
# 如果出現ActiveRecord::RecordNotFound就用record_not_found方法
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
private
# 渲染rails提供的404頁面,狀態也同步改成404
def record_not_found
render file: "public/404.html", status: 404
end
end
```
notes_controller.rb
```rb
# before_action = before_filter,做指定 action 前先撈資料
# before_action 是一個類別方法,是 singleton method
before_action :find_note, only: [:show, :edit, :update, :destroy]
```
index.html.erb
```rb
<%# method 預設為 get 要改成delete%>
<%# rel="nofollow" 叫爬蟲不要跟過來 %>
<%# data-method="delete"%>
<%# 按超連結會形成一個表單 ,JS 會把 method 跟 token 塞進來%>
<%# method 因為常用變特化版,也可以用 data 包起來%>
<%# id: note.id 可搭配JS使用,取得特定資料 %>
<%# destroy 刪除內容,要多加delete方法,不然會走錯路,走到show頁面 %>
<%= link_to "刪除", note_path(note), method: "delete",
data: {confirm: "確定嗎?",id: note.id } %>
```
_form.html.erb
```rb
<%# 從@note 改成 note 讓_form.html不要自己亂抓東西,怕會抓到重複的%>
<%# 只要根據餵進來的東西在這邊呈現就好%>
<% if note.errors.any? %>
<ul>
<% note.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
```
edit.html.erb
```rb
<%# partial render %>
<%# view 提供的 render 不能把字串 form 改成符號,跟controller 的 render 不一樣%>
<%# 把 edit 的 @note 丟過來再丟到_form.html.erb,最後渲染回來 %>
<%= render "form", note: @note %>
```
new.html.erb
```rb
<%# 把 new 的 @note 丟過來再丟到_form.html.erb,最後渲染回來 %>
<%= render "form", note: @note %>
```
---
[Rails XMind](https://www.xmind.net/m/jMUqLi)
---
###### tags: `Ruby` `Rails` `DataBase`