---
# System prepended metadata

title: Ruby(07/14) 五倍紅寶石(第八屆共筆)(2021/8/12)
tags: [Rails, DataBase, Ruby]

---

# 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`