本章淺談:
暫時不去看 view 的部分
好好觀察在 CRUD 的機制裡 Controller 是怎麼運作的
又是怎麼跟 Model 互動
Model 又是用什麼方式來驗證資料跟存取資料庫
可以另外再開一個分頁 打開 2-1. 手動實作出有 CRUD 功能的討論版
最下面 app/controllers/groups_controller.eb 的內容,用來對應下面要描述的東西
基本概念
以 2 - 2 的案例來示範,我們已經設定好 Group 這個class(在 app/models/group.rb )
並且設定好它的資料庫格式: Title欄位(屬性: 字串string) 跟 Description欄位(屬性:多行文字text)
class Group < ActiveRecord::Base
validates :title, :presence => true
end
雖然整個檔案只有短短三行 code 但有多種功能:
< ActiveRecord::Base
代表這個 class 繼承了 Rails 裡內建的函式庫: ActiveRecord::Base 裡的功能ActiveRecord 是 Rails 的 ORM(Object Relational Mapping) 元件,負責與資料庫溝通,讓我們能用 Ruby 語法操作資料庫
以本例來說,我們就能在 Controller 或是 Rails Console (主控台)用 Group 來呼叫對應在資料庫裡的『Group』這個資料表,並操作 CRUD 功能
更能在 app/models/group.rb 裡面做出許多跟資料庫相關的設定,例如第二行就是設定 title 這個欄位必填(不能空白)
建立一個物件,一個能寫進資料庫: group 裡變成一筆新資料的物件
@group = Group.new
代表我們將 @group 這個實例變數設定成一個新物件,格式與規則等同 app/models/group.rb 的設定
(可以看看這段程式碼出現在哪個 action )
這個物件的格式就是
@group = { :id => "",
:title => "",
:description => ""}
有欄位設定,因為是新建立的,無內容
以下是資料庫裡 groups 的資料,我們會用這個資料表做範例:
groups
id | title | description |
---|---|---|
1 | Ariel | Ariel的秘密花園 |
2 | Bill | Bill之家 |
3 | Carl | Carl的工作室 |
4 | Della | Della的小窩 |
我們可以使用
@group = Group.find(3)
讀取(read)出 id 是 3 的這筆資料
(查看看這段函式是不是跟某幾個Action很像?)
這個物件格式內的資料就是
@group = { :id => "3",
:title => "Carl",
:description => "Carl的工作室"}
{ } 裡的資料,就是所謂的雜湊(Hash),一個陣列化的變數
以此為例,如果這個Hash的格式與資料能通過 app/model/group.rb 裡的驗證,格式與資料符合,就能允許將它儲存起來
這時候如果輸入
puts @group[:title]
=> "Carl"
puts @group[:description]
=> "Carl的工作室"
CRUD 運作解密 (Controller)
Create
@group = Group.new
@group.title = "Esse"
@group.description = "Esse的衣帽間"
@group.save
Read
@group = Group.find(2)
Update
@group = Group.find(2)
@group.description = "Bill的秘密基地"
@group.save
Delete
@group = Group.find(2)
@group.destroy
以上就是 CRUD 的運作邏輯
我們要把它運用進網站的運作,所以實際的運作會是這樣:
Create運作
(點擊建立新group按鈕) => 觸發new action(@group = Group.new) => 開啓new.html這個頁面
在new.html裡把資料寫好以後 例如 標題: Esse , 敘述:Esse的衣帽間 => 點擊送出(submit)按鈕
=> 觸發create action
@group.new(:title => "Esse", :description => "Esse的衣帽間")
@group.save
Read運作
@group = Group.find(params[:id])
裡面的 params[:id] 是參數設定,可以讓我們在輸入 HTTP request(例如網址: group/2)時
轉成 @group = Group.find(2)
除了.find外,我們還可以用其他指令做運用
指令 | 用法 |
---|---|
Group.first | 叫出第一筆資料 |
Group.last | 叫出最後一筆資料 |
Group.all | 叫出全部資料(請看看index action) |
Group.count | 叫出資料表內有多少資料筆數 |
Group.limit(10) | 只叫出十筆資料 |
延伸閱讀:更多用法
在網站運作裡,會觸發 show action 轉成討論版個版的頁面
Update運作
點擊個版頁面裡的 Edit 按鈕 => 觸發 edit action => 進入edit.html
輸入修改後的資料 => 點送出按鈕 => 觸發 update action
Delete運作
bj4 ... XD
CRUD 運作解密 (Model)
bj4 ... XD
其他 Model 資料驗證的語法:
參數 | 意思 |
---|---|
:presence => true | 此欄位必填 |
:numericality => true | 此欄位只能填數字 |
:uniqueness => true | 此欄位資料不能重複 |
:confirmation => true | 需要在表單輸入二次,例如密碼確認 |
:acceptance => true | 此欄位為Checkbox方塊,例如使用者條款確認 |
:length => { :minimum => 0, :maximum => 2000} : | 限定欄位字元長度(本例是最短0,最長2000) |
:format => { :with => /.*/ } | 設定欄位資料的格式(例如網址、email) |
:inclusion => { :in => [18..99]} | 只能允許輸入 18 ~ 99的值 |
:exclusion => { :in => [0..18]} | 禁止1 ~ 17之間的數字輸入 (例如18禁) |
延伸閱讀:更多用法