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