這篇看完應該很多人會覺得上一篇很機車,等看完就知道了(笑)
在開始說明之前,必須先提到CRUD這四個字,他可是十分重要的
C -> Create
R -> Read
U -> Update(edit)
D -> Delete
腦筋動得快的人應該就會發現這不就是我們上次做留言版的各種操作嗎?
沒錯,但這四項操作的真正身分其實是資料庫的四大操作,並不單單用來設計在留言板上而已。
因此ROR特別使用了scaffold這道指令來完成所有資料庫操作的控制,現在就讓我們來試試看吧!
PS.建議開新的rails專案來練習,避免與上次手動建立的留言板起衝突。
首先打入以下指令
$script/generate scaffold
跑出scaffold的說明後,一樣複製範例的指令輸入
$script/generate scaffold post title:string body:text published:boolean
此時相關的控制資料檔案與程式碼就建立好了,但是還沒有建立資料庫,因此再打入以下指令
$rake db:create
$rake db:migrate
這樣就完成了整個留言版的設計,不信的話就啟動server開啟瀏覽器來看看
$script/server
網址列打上http://localhost:3000/posts
不親眼看到還真不相信,之前做得那麼多竟然幾行指令就完成了... 有沒有覺得很機車啊~ 哈哈!
有關scaffold的部分可以參考下列網站,雖然我自己也看不太懂就是了XD
http://blog.longwin.com.tw/2008/11/ror-learn-3-scaffold-crud-process-step-2008/
2011年3月28日 星期一
手動建立留言板 - 步驟2 建立Controller
還記得MCV的核心構造吧? 在建立完database(M)之後就要建立起留言版的控制器了,使用之前所學的方式來設計控制器。
PS.Controller最好一個主要功能就建立一個,不要混用,要不然容易出問題。
建立Controller
首先我們來思考一下一個留言板需要具備那些功能:
*顯示留言的清單(list)
*建立新留言(new)
*編輯留言(edit)
*刪除留言(delete)
*回覆留言(reply)
*顯示留言全文(show)
*在資料庫中建立留言的資料(create)
因此我們針對以上功能打入指令:
$script/generate controller post list new edit delete reply show create
建立完成後,我們運行Server看有沒有建立成功
$script/server
網址列打上http://localhost:3000/post/list
如果出現畫面就是建立完成了
接著來設計Controller的控制方式
設計Controller的運作方式
我們一開始進入post的頁面理應是list,也就是留言清單的部分,在顯示清單前總要先有一筆資料建立起來
因此在list.html.erb中加入按鈕的ruby程式(list.html.erb檔案在app/views/post/底下)
<%= button_to "New Post",:action=>:new %>
重新整理網頁看看是否建立起轉址了。
接著在new頁面中我們要設計讓使用者輸入的區塊,因此編輯new.html.erb
<% form_tag url_for(:action=>:create) do %>
<%=label_tag "Title" %>
<%=text_field_tag:title, "預設值(可沒有)" %>
"hr" (因為blog的關係才要加雙引號,真正打請改成用<>包覆才是html的語法)
<%=label_tag "body" %> "br"
<%=text_area_tag:body %> "br"
<%=submit_tag "Create" %>
<% end %>
其中需要說明的應該只有第一行跟最後一行而已,其它自己一看就懂了,第一行代表這是一個區塊,當這個區塊送出一個tag(也就是submit_tag按下這個按鈕後),就將網址轉到create。
現在問題來了,我們該怎麼把這個網頁(new)打的東西傳到create來做資料庫的資料建立呢?
這時就要透過Controller來進行控制,也就是MCV的概念,當使用者在views的網頁中操作完成後,views要把操作的指令送給Controller作轉址,再轉址前Controller會依據設計將這網頁的內容傳入Create中,因此我們現在就來設計Controller。
編輯post_controller.rb(在app/controllers/底下)
在裡面的def create 下面加入
@title=params[:title];
@body=params[:body];
其中第一行@title代表宣告一個變數來儲存上個網頁的參數title(params[:title]),第二行也是相同道理。
接著修改create.html.erb
title=<%=@title%>"br"
body=<%=@body%>
然後瀏覽器重新整理看看是不是有把參數傳入。
接下來就要在資料庫中建立資料了
繼續編輯post_controller.rb,從剛剛的位置(@body的下一行)繼續寫起
@post=Post.new;
@post.title=@title;
@post.body=@body;
@post.save;
Post.new的P記得大寫(代表資料庫動作)
完成後重新建立起一筆新留言,然後用sqlbrowser看看確認資料已經在裡面了。
這樣就完成資料庫的資料建立,再來修改create.html.erb,讓他直接轉址回到list,然後在list中建立顯示資料的控制。
後面的其他設計就類似這種方式,在此就不多說了。
PS.Controller最好一個主要功能就建立一個,不要混用,要不然容易出問題。
建立Controller
首先我們來思考一下一個留言板需要具備那些功能:
*顯示留言的清單(list)
*建立新留言(new)
*編輯留言(edit)
*刪除留言(delete)
*回覆留言(reply)
*顯示留言全文(show)
*在資料庫中建立留言的資料(create)
因此我們針對以上功能打入指令:
$script/generate controller post list new edit delete reply show create
建立完成後,我們運行Server看有沒有建立成功
$script/server
網址列打上http://localhost:3000/post/list
如果出現畫面就是建立完成了
接著來設計Controller的控制方式
設計Controller的運作方式
我們一開始進入post的頁面理應是list,也就是留言清單的部分,在顯示清單前總要先有一筆資料建立起來
因此在list.html.erb中加入按鈕的ruby程式(list.html.erb檔案在app/views/post/底下)
<%= button_to "New Post",:action=>:new %>
重新整理網頁看看是否建立起轉址了。
接著在new頁面中我們要設計讓使用者輸入的區塊,因此編輯new.html.erb
<% form_tag url_for(:action=>:create) do %>
<%=label_tag "Title" %>
<%=text_field_tag:title, "預設值(可沒有)" %>
"hr" (因為blog的關係才要加雙引號,真正打請改成用<>包覆才是html的語法)
<%=label_tag "body" %> "br"
<%=text_area_tag:body %> "br"
<%=submit_tag "Create" %>
<% end %>
其中需要說明的應該只有第一行跟最後一行而已,其它自己一看就懂了,第一行代表這是一個區塊,當這個區塊送出一個tag(也就是submit_tag按下這個按鈕後),就將網址轉到create。
現在問題來了,我們該怎麼把這個網頁(new)打的東西傳到create來做資料庫的資料建立呢?
這時就要透過Controller來進行控制,也就是MCV的概念,當使用者在views的網頁中操作完成後,views要把操作的指令送給Controller作轉址,再轉址前Controller會依據設計將這網頁的內容傳入Create中,因此我們現在就來設計Controller。
編輯post_controller.rb(在app/controllers/底下)
在裡面的def create 下面加入
@title=params[:title];
@body=params[:body];
其中第一行@title代表宣告一個變數來儲存上個網頁的參數title(params[:title]),第二行也是相同道理。
接著修改create.html.erb
title=<%=@title%>"br"
body=<%=@body%>
然後瀏覽器重新整理看看是不是有把參數傳入。
接下來就要在資料庫中建立資料了
繼續編輯post_controller.rb,從剛剛的位置(@body的下一行)繼續寫起
@post=Post.new;
@post.title=@title;
@post.body=@body;
@post.save;
Post.new的P記得大寫(代表資料庫動作)
完成後重新建立起一筆新留言,然後用sqlbrowser看看確認資料已經在裡面了。
這樣就完成資料庫的資料建立,再來修改create.html.erb,讓他直接轉址回到list,然後在list中建立顯示資料的控制。
後面的其他設計就類似這種方式,在此就不多說了。
手動建立留言板 - 步驟1 建立資料庫
在講解完ROR的核心架構後,接下來就開始進入完整的ROR系統設計了,我們要依據MCV的架構來進行基本留言板的架設。
建立Model(資料庫)
基本上ROR已經有提供自動建立留言版的Model功能,因此我們只要下建立的指令即可
$script/generate model
下了這道指令後會跑出各種model的說明,我們直接針對他提供的Post例子來進行留言版的資料庫建立
$script/generate model post tilte:string body:text published:boolean
這道指令用看的就知道是怎樣的結構,很簡單明瞭,就是建立一個叫post的資料庫,這個資料庫的欄位(field)有title(型態string)、body(型態text)、published(型態boolean),各別代表留言的標題、內容與是否為私密留言這三種類型。
接著打入以下指令:
$rake db:migrate
rake有點類似make的這種人家幫你寫好的程序,db代表database,migrate代表遷移的動作,也就是會將剛剛建的資料庫遷移至rake裡面程序設定的控管下,這樣才能透過ruby來簡單操作資料庫。
對於rake與migrate的相關資料官網與其他網站上有說明,這邊附上網址
http://guides.ruby.tw/rails3/migrations.html 官網說明
http://ihower.tw/rails3/rails-recipes.html rake的更多應用
到這邊資料庫就算建立完成了。
使用SQLiteBrowser查看資料庫的資料
完成資料庫建立後我們該怎麼資料有沒有建立成功呢? 之後新增刪除資料怎麼知道資料庫有沒有動作呢?
因此我們現在安裝sqlitebrowser這個小工具可以幫我們查看SQL資料庫的內部情況
$sudo apt-get install sqlitebrowser
安裝完後打入
$sqlitebrowser db/development.sqlite3
就會跑出以下的畫面了
接著我們點擊Browse Data就可以看到剛剛建立的post資料庫了,以後有對資料庫做任何的動作都可以從這裡看到。
眼尖的人應該會發現當初明明建立的名字叫做post,為什麼這邊會變成posts? 這是因為rails這邊針對資料庫的命名都以複數為主,因此輸入單數的詞會自動轉成複數。
另外我們可以看到除了當初定義的三種欄位外,還有另外兩個created_at與update_at的欄位,這是系統會幫忙處理的欄位,他會記錄這筆資料建立的時間與修改(更新)的時間,這兩種資料對於資料庫非常的重要,這關係到多人存取的問題,因為網路會有delay的情況,因此有可能先下的指令會後到,為了避免這種情況的問題就需要紀錄資料的修改時間與建立時間。
建立Model(資料庫)
基本上ROR已經有提供自動建立留言版的Model功能,因此我們只要下建立的指令即可
$script/generate model
下了這道指令後會跑出各種model的說明,我們直接針對他提供的Post例子來進行留言版的資料庫建立
$script/generate model post tilte:string body:text published:boolean
這道指令用看的就知道是怎樣的結構,很簡單明瞭,就是建立一個叫post的資料庫,這個資料庫的欄位(field)有title(型態string)、body(型態text)、published(型態boolean),各別代表留言的標題、內容與是否為私密留言這三種類型。
接著打入以下指令:
$rake db:migrate
rake有點類似make的這種人家幫你寫好的程序,db代表database,migrate代表遷移的動作,也就是會將剛剛建的資料庫遷移至rake裡面程序設定的控管下,這樣才能透過ruby來簡單操作資料庫。
對於rake與migrate的相關資料官網與其他網站上有說明,這邊附上網址
http://guides.ruby.tw/rails3/migrations.html 官網說明
http://ihower.tw/rails3/rails-recipes.html rake的更多應用
到這邊資料庫就算建立完成了。
使用SQLiteBrowser查看資料庫的資料
完成資料庫建立後我們該怎麼資料有沒有建立成功呢? 之後新增刪除資料怎麼知道資料庫有沒有動作呢?
因此我們現在安裝sqlitebrowser這個小工具可以幫我們查看SQL資料庫的內部情況
$sudo apt-get install sqlitebrowser
安裝完後打入
$sqlitebrowser db/development.sqlite3
就會跑出以下的畫面了
接著我們點擊Browse Data就可以看到剛剛建立的post資料庫了,以後有對資料庫做任何的動作都可以從這裡看到。
眼尖的人應該會發現當初明明建立的名字叫做post,為什麼這邊會變成posts? 這是因為rails這邊針對資料庫的命名都以複數為主,因此輸入單數的詞會自動轉成複數。
另外我們可以看到除了當初定義的三種欄位外,還有另外兩個created_at與update_at的欄位,這是系統會幫忙處理的欄位,他會記錄這筆資料建立的時間與修改(更新)的時間,這兩種資料對於資料庫非常的重要,這關係到多人存取的問題,因為網路會有delay的情況,因此有可能先下的指令會後到,為了避免這種情況的問題就需要紀錄資料的修改時間與建立時間。
2011年3月27日 星期日
ROR架構說明
接下來就是比較進階的部分了,在繼續做之前需要先了解一下ROR的核心架構...
首先來看一下整體架構圖:
M: Model -> 資料庫(database),負責儲存資料
C: Controller -> 控制端,負責掌控整個網頁與資料庫的處理
V: Views -> 顯示端,負責網頁的頁面顯示與接受使用者(用戶端)操作
一般來說,以一個網站架構而言,大致上分為給用戶的基本使用者網頁、後臺控制、資料庫等三種常見的核心架構,而ROR正是依照此架構下去設計,當這三者分立時在設計上面會變得十分有條理,也較好進行各種設計。
舉個例來說明這三者之間的關係,今天如果有個購物網站,當使用者首頁顯示的就是Views中所設計的,因此在網頁的各種美觀上都是在Views中的網頁設計所表現出來,再來當使用者要進入商品網頁時就會按下超連結(或按鈕),此時Views的網頁會將使用者的操作交給Controller做處理,在轉到商品頁面前會先從資料庫(DataBase)裡讀取此商品的各項資料然後放入Views中所設計好的框架中,之後顯示網頁畫面給使用者看,當使用者要購買商品時就需要登入會員,於是會透過Controller轉址到控制頁面上,此時Views會顯示輸入帳密的網頁給使用者輸入,使用者輸入完後按下確認鍵,Controller就會依據帳號存取資料庫然後比對密碼是否正確,如果正確才會正式進入購買的頁面中...,上述的差不多就是這三者的配合關係,舉凡所有網站幾乎都脫離不了這核心架構。
首先來看一下整體架構圖:
M: Model -> 資料庫(database),負責儲存資料
C: Controller -> 控制端,負責掌控整個網頁與資料庫的處理
V: Views -> 顯示端,負責網頁的頁面顯示與接受使用者(用戶端)操作
一般來說,以一個網站架構而言,大致上分為給用戶的基本使用者網頁、後臺控制、資料庫等三種常見的核心架構,而ROR正是依照此架構下去設計,當這三者分立時在設計上面會變得十分有條理,也較好進行各種設計。
舉個例來說明這三者之間的關係,今天如果有個購物網站,當使用者首頁顯示的就是Views中所設計的,因此在網頁的各種美觀上都是在Views中的網頁設計所表現出來,再來當使用者要進入商品網頁時就會按下超連結(或按鈕),此時Views的網頁會將使用者的操作交給Controller做處理,在轉到商品頁面前會先從資料庫(DataBase)裡讀取此商品的各項資料然後放入Views中所設計好的框架中,之後顯示網頁畫面給使用者看,當使用者要購買商品時就需要登入會員,於是會透過Controller轉址到控制頁面上,此時Views會顯示輸入帳密的網頁給使用者輸入,使用者輸入完後按下確認鍵,Controller就會依據帳號存取資料庫然後比對密碼是否正確,如果正確才會正式進入購買的頁面中...,上述的差不多就是這三者的配合關係,舉凡所有網站幾乎都脫離不了這核心架構。
2011年3月7日 星期一
Rails 的 Controller說明與建立
接下來終於開始慢慢進入正題了
再開始前先講一下之前的問題,當有多個Rails Server 運作時會造成一些不必要的問題
因此在進行所有動作前先確認是否將Rails Server關閉
透過以下Linux指令來做確認
$aux / grep ruby
查看ruby的Process與PID
$kill -9 PID
刪除指定的PID Process
Rails的Controller
首先查看rails工作目錄中會有一個資料夾叫做"app"
此資料夾就是application的縮寫,也就是專門處理網站中各種應用程式的開發
接著我們進入app資料夾中應該可以看到四個子資料夾
controller
helpers
models
views
這次的主題在於controller,因此我們先不管helpers與models。
views資料夾底下所放置的就是各個子網頁
而Controller裡面一定會有對應View每個子網頁的項目
所以說Controller指的就是子網頁的控制方式,也意味著可透過Controller來進行應用程式的開發
再來進入Controller可以看見有一個檔案application_controller.rb
副檔名是.rb意謂著是使用ruby語法所做出來的控制器(Controller)
這個檔案裡面的資料就是Ruby的程式,但我們先暫時不管,等到未來再進行說明
瞭解了Controller是什麼東西後,那麼我們開如何去創建新的子網頁與控制器呢?
有兩種方式,一種是手動在Controllers資料夾中建立檔案,同時views的資料夾下也要建立相同的子網頁
另一種方式就是透過rails所提供的Script來自動建立子網頁與控制器
在這邊使用第二種方式來進行
使用Script來建立子網頁與Controller
我們將工作目錄移往rails專案資料夾,接著在終端機(terminals)中打入以下指令
$script/generate controller 控制器類別 關連的子網頁名
ex. $script/generate controller Test index t01
其中test代表的是控制器的類別(=方法),也就是你要設計的控制應用程式類別名
而index與t01則是你要使用此類別控制器(test)所控制的子網頁名
PS. 一般常用的命名法則為第一個字母大寫,若是多個字的結合則是每個字的第一個字母都大寫
ex. FirstWord
PS2. 若是打入$script/generate則是會跑出generate這個script的使用說明,有興趣的可以參考看看。
在完成建立後,會發現Controllers資料夾中已經多出了一個test_controller.rb的控制器檔案了
而且在views資料夾也可以找到相對應的子資料夾test,裡面放著剛剛建立的兩個子網頁index.html.erb與t01.html.erb
副檔名為erb代表此網頁是可支援ruby語法的網頁
從這邊可以知道一個Controller必定對應一個views中的子目錄(且目錄名一樣)
因此若是透過第一種手動建立的方式則也必須依循此規則進行
運行Server並確認子網頁是否已建立完成
上一步終於將子網頁與控制器建立完成,現在就來測試看看吧!
確認目前工作目錄是在rails的專案資料夾底下,接著輸入以下指令
$script/server
之後開啟瀏覽器,在網址列輸入: localhost:3000/控制器類別/子網頁
ex. localhost:3000/test/
這樣就會看到剛剛建立的子網頁
有人會問我們剛剛不是建立了兩個子網頁index與t01嗎? 他怎麼會知道要進入那個網頁?
基本上伺服器預設若是有index這個網頁就優先進入index,因此他會先進入index
當然也可以再多加子網頁的名字:
ex. localhost:3000/test/index
ex2. localhost:3000/test/t01
這樣就完成了Controller與子網頁的建立。
再開始前先講一下之前的問題,當有多個Rails Server 運作時會造成一些不必要的問題
因此在進行所有動作前先確認是否將Rails Server關閉
透過以下Linux指令來做確認
$aux / grep ruby
查看ruby的Process與PID
$kill -9 PID
刪除指定的PID Process
Rails的Controller
首先查看rails工作目錄中會有一個資料夾叫做"app"
此資料夾就是application的縮寫,也就是專門處理網站中各種應用程式的開發
接著我們進入app資料夾中應該可以看到四個子資料夾
controller
helpers
models
views
這次的主題在於controller,因此我們先不管helpers與models。
views資料夾底下所放置的就是各個子網頁
而Controller裡面一定會有對應View每個子網頁的項目
所以說Controller指的就是子網頁的控制方式,也意味著可透過Controller來進行應用程式的開發
再來進入Controller可以看見有一個檔案application_controller.rb
副檔名是.rb意謂著是使用ruby語法所做出來的控制器(Controller)
這個檔案裡面的資料就是Ruby的程式,但我們先暫時不管,等到未來再進行說明
瞭解了Controller是什麼東西後,那麼我們開如何去創建新的子網頁與控制器呢?
有兩種方式,一種是手動在Controllers資料夾中建立檔案,同時views的資料夾下也要建立相同的子網頁
另一種方式就是透過rails所提供的Script來自動建立子網頁與控制器
在這邊使用第二種方式來進行
使用Script來建立子網頁與Controller
我們將工作目錄移往rails專案資料夾,接著在終端機(terminals)中打入以下指令
$script/generate controller 控制器類別 關連的子網頁名
ex. $script/generate controller Test index t01
其中test代表的是控制器的類別(=方法),也就是你要設計的控制應用程式類別名
而index與t01則是你要使用此類別控制器(test)所控制的子網頁名
PS. 一般常用的命名法則為第一個字母大寫,若是多個字的結合則是每個字的第一個字母都大寫
ex. FirstWord
PS2. 若是打入$script/generate則是會跑出generate這個script的使用說明,有興趣的可以參考看看。
在完成建立後,會發現Controllers資料夾中已經多出了一個test_controller.rb的控制器檔案了
而且在views資料夾也可以找到相對應的子資料夾test,裡面放著剛剛建立的兩個子網頁index.html.erb與t01.html.erb
副檔名為erb代表此網頁是可支援ruby語法的網頁
從這邊可以知道一個Controller必定對應一個views中的子目錄(且目錄名一樣)
因此若是透過第一種手動建立的方式則也必須依循此規則進行
運行Server並確認子網頁是否已建立完成
上一步終於將子網頁與控制器建立完成,現在就來測試看看吧!
確認目前工作目錄是在rails的專案資料夾底下,接著輸入以下指令
$script/server
之後開啟瀏覽器,在網址列輸入: localhost:3000/控制器類別/子網頁
ex. localhost:3000/test/
這樣就會看到剛剛建立的子網頁
有人會問我們剛剛不是建立了兩個子網頁index與t01嗎? 他怎麼會知道要進入那個網頁?
基本上伺服器預設若是有index這個網頁就優先進入index,因此他會先進入index
當然也可以再多加子網頁的名字:
ex. localhost:3000/test/index
ex2. localhost:3000/test/t01
這樣就完成了Controller與子網頁的建立。
訂閱:
文章 (Atom)