almost 4 years ago

本章淺談:

暫時不去看 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)

app/models/group.rb
class Group < ActiveRecord::Base
    validates :title, :presence => true
end

雖然整個檔案只有短短三行 code 但有多種功能:

  1. < ActiveRecord::Base 代表這個 class 繼承了 Rails 裡內建的函式庫: ActiveRecord::Base 裡的功能

  2. ActiveRecord 是 Rails 的 ORM(Object Relational Mapping) 元件,負責與資料庫溝通,讓我們能用 Ruby 語法操作資料庫

  3. 以本例來說,我們就能在 Controller 或是 Rails Console (主控台)用 Group 來呼叫對應在資料庫裡的『Group』這個資料表,並操作 CRUD 功能

  4. 更能在 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

create action的內容是
@group.new(:title => "Esse", :description => "Esse的衣帽間")
@group.save

Read運作

app/controllers/groups_controller.eb
@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禁)

延伸閱讀:更多用法

← [延伸閱讀] MVC 架構與 RESTful 概念 [延伸閱讀] Strong Parameters →
 
comments powered by Disqus