2011年3月28日 星期一

利用ROR工具自動建立留言板

這篇看完應該很多人會覺得上一篇很機車,等看完就知道了(笑)

在開始說明之前,必須先提到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/

手動建立留言板 - 步驟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中建立顯示資料的控制。

後面的其他設計就類似這種方式,在此就不多說了。

手動建立留言板 - 步驟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的情況,因此有可能先下的指令會後到,為了避免這種情況的問題就需要紀錄資料的修改時間與建立時間。

2011年3月27日 星期日

ROR架構說明

接下來就是比較進階的部分了,在繼續做之前需要先了解一下ROR的核心架構...

首先來看一下整體架構圖:


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與子網頁的建立。

2011年2月23日 星期三

建立與運作第一個Rails Server

接下來就小試身手一下


建立Rails Server

1.建立Sever前先確認是否將啟動rails的路徑設定完成

$ sudo ln -s -f /var/lib/gems/1.8/bin/rails /etc/bin/rails

2.使用rails指令建立Server

$ rails 資料夾名(若未存在則會自動建立)

ex. $ rails FirstServer

等他跑完就完成建立Sever了

注意: 在下rails指令前先利用cd將工作目錄移動到要存放Server資料的位置(若是有SVN則最好建立在SVN的控管目錄下)


運作Server

1.移動至Server的目錄下

$ cd FirstServer

2.運行Script資料夾底下的Server檔案

$ Script/server . <-注意server後是空一格然後加"."代表運行的意思

在啟動過程中會告知Server使用Local主機的哪一Port,預設是3000

3.查看是否已成功啟動

開啟瀏覽器,在網址列打上"localhost:3000\"後應該可以看見Server的首頁

PS. localhost代表自己的主機位置後面接":"代表Port

PS2. Server的首頁是放在Sever資料夾底下的Public裡面叫作index.html的檔案,更改裡面的內容就可以在瀏覽器上看到。


這樣第一次的運作就完成了,期待下次的課程。

SVN的環境建置與基礎操作

由於老師ROR作業要做方便管理,因此採用了SVN的管理機制,使用學校自己的SVN網域,因此要安裝SVN作處理。

SVN介紹與完整中文說明手冊:http://twpug.net/docs/Subversion/


SVN的環境建置

$sudo apt-get intall subversion


SVN的基礎操作指令

建立與SVN伺服器資料庫的連結

$svn co --username 帳號 svn://你的網址 要在local主機上目前路徑上儲存的資料夾名(若是沒有他會自動建立)

ex. $svn co --username 9728111 svn://140.135.12.119/ror/g0x g0x

PS.在連線完成後SVN的系統會自動將你帳號內的資料download到你的local主機上

PS2. co 就是checkout的縮寫,SVN支援縮寫,當然也可以寫checkout

注意:以下指令需要在工作目錄下才能運作,一開始建立連線的資料夾後,記得cd至該資料夾下

加入新資料

$svn add 目前路徑上要增加至伺服器的資料夾名或檔案名

ex. $svn add abc

注意: 在這邊的add只是告知SVN我有增加這檔案或資料夾,並未上傳上去,因此此時的狀態會是"?"(請見下面指令)

ex. $svn add *

*代表底下所有目錄與檔案都加入

檢查SVN檔案與本機檔案的狀態

$svn st

在檔案前面常見的顯示結果有
M -> 代表本機的檔案有修改過
? -> 代表尚未上傳至伺服器的資料或資料夾
! -> 代表本機上的此檔案已經不見了(被移除之類的情況),但是伺服器上仍然有這檔案
A -> 此次新增的檔案
C -> 此檔案已經有人改過, 合併不成功, 需要人工介入
D -> 此次移除的檔案
M -> 此檔案有修改過
U -> 此檔案有被更新過

(部分資料取自http://plog.longwin.com.tw/my_note-programming/2007/07/10/svn_tutorial_2007 svn基本指令教學)

將資料上傳至SVN伺服器

$svn ci -m "這次上傳的註解"

ex. $svn ci -m "更動XXX.doc檔"

-m -> 代表增加上傳的版本註解

PS. ci 為 commit的縮寫

查看本機上傳至伺服器的記錄

$svn log

從伺服器更新本機資料(3/7更新)

$svn up

當多人使用時,若有一人更新伺服器資料時,透過此指令可進行更新且不會蓋過整個工作目錄(僅針對當時的子目錄進行更新)

$svn up -r 版本號碼

-r代表可以選擇版本進行更新

還原成伺服器版本(3/7更新)

$svn revert 檔名(或資料夾)

更新時發現有問題可以透過此指令還原至伺服器上的版本

操作伺服器上的檔案(尚未確認)

$svn 指令

指令可以是常用的指令如ls、cd、rm、mkdir等...



大概先這樣以後若是有學到更多的操作方式再更新