目前分類:深入淺出RoR (6)

瀏覽方式: 標題列表 簡短摘要

Rails 1.2 引進了 REST 觀念。而在 Rails 2.0 ,RESTful 更成為這個版本的主要重點之一。

如果你對 RESTful Rails 不甚了解,推薦 RESTful Rails 簡單心得 這篇文章當入門磚。而希望深入了解的可以閱讀 ihower 的 什麼是REST跟RESTful? 。不過我傾向建議你看完這篇文章再去啃這兩篇。

在 config/routes.rb 加入上面那一行,就是具體在 rails 實作 RESTful 支援的方式。

這樣的宣告將在自動對應 URL路徑跟 Controller 的 action ,而有以下的結果 :

GET: /blogs => [:action => 'index']
GET: /blogs.xml => [:action => 'index', :format => 'xml']
GET: /blogs/1 => [:action => 'show', :id => 1]
GET: /blogs/1/edit => [:action => 'edit', :id => 1]
GET: /blogs/1.xml => [:action => 'show', :id => 1, :format => 'xml']
POST: /blogs => [:action => 'create']
PUT: /blogs/1 => [:action => 'update', :id => 1]
DELETE: /blogs/1 => [:action => 'destroy', :id => 1]

也就是使用 named routes 來實作出 verb-oriented controllers,單一個 resource 根據 HTTP verb 而有不同的行為。

除了產生對應 routes 的 action 給 Controller,最方便的是自動產生了一些 helpers 給 views。

helpersHTTP Verb產生的Path對應的Action
blogs_path GET /blogs index
blog_path(id) GET /blogs/1 show
new_blog_path GET /blogs/new new
blogs_path POST /blogs create
edit_blog_path(id) GET /blogs/1/edit edit
bloh_path(id) PUT /blogs/1

update

blog_path(id) DELETE /blogs/1 destro


相信這一些解說能大致讓你對 blogs_controller 或 view 裡的一些 path 有一些粗淺的了解。

verb-oriented 有什麼好處呢?最明顯的好處就是在 Rails 1.1 中需要花上很多功夫刻的 action code,在 Rails 2.x 中大部分都可以藉由 htttp verb 作掉。我個人曾經將 VeryXD 進行了由 1.x -> 2.x 的升級改寫,利用這個 feature,砍了將近一半以上的 code 行數

 

本篇文章接下來對 controller 的 action 作一點簡單的解說。

index 是拉列表的動作。因此 Post.all 是拉出 Post 這個 model 所有的資料。

show 秀出單筆資料。 Post.find(123) 是指找 Post model 裡 id 為 123 的資料。http://demosite.com/blogs/show/123 的 blogs 是 controller、show 是 action;如果在 route 裡面沒有特別指定,則 123 通常就是 params[:id] 。

new 應該不必多說,就是 initial 一個 Post 的新 object。

edit 這邊跟 show 相同的作法,是拉出 Post model 裡指定的 object ,只是資料拉出來,編輯。

create 這邊我們要翻回 app/views/blogs/new.html.erb 這個 view 並列一起來看。

在 RESTful Rails 的寫法中,對 blogs_path (就是 index action )丟 POST 就是對應到 create 的動作。而 Rails 在設計上,form 是綁 model 的,因此整個 form 的內容會被包成一個 hash,在這裡就是 params[:post]。create action 初始一個 object ,並把 params[:post] 整包塞進這個 object 裡。如果 @post 能夠成功的儲存,就「重導」到 index action ,失敗則「退回」到 new action 。

update 這邊我們也要翻回 app/views/blogs/edit.html.erb 這個 view  一起來看。

在 RESTful Rails 的寫法中,對 blog_path (就是 show action )丟 PUT 就是對應到 update 的動作。form 會背包成一個 hash,如果 @post 能夠吃進 params[:post] 進行更新且成功儲存,就會「重導」到 show action,失敗則「退回」到 edit action。

delete 找到該筆資料並刪除之。在 RESTful Rails 的寫法中,對 blog_path(就是 show action) 丟 DELETE 對應到 destroy 的動作。可看一下 link_to "Destroy" 那一行。

 

看到這個段落,我想應該能讓你對 RESTful Rails 以及 CRUD 中的各種互動有一點粗淺的瞭解。

rails 發表在 痞客邦 留言(2) 人氣()

作好了 Blog controller 之後。現在來產生 model。

scrip/generate model [model name]

  

打開 db/migrate 下的 migration 檔案。

一篇 Post 要有哪些欄位呢?(通常是標題和內容)

rake db:migrate

自動幫忙開好資料表以及欄位。

----

為加速 Tutorial 的進行。我預先將 CRUD 的範例程式碼貼出,你可以先依樣畫葫蘆的實做試玩,我會在下一節另行解釋這些 code 的運作原理。

 

app/controllers/blogs_controlle.erb

 

app/views/blogs/new.html.erb

 

app/views/blogs/index.html.erb

 

app/views/blogs/edit.html.erb

 

app/views/blogs/show.html.erb


最後,在 routes.rb 加入

rails 發表在 痞客邦 留言(0) 人氣()

這一章我們使用了 Blog 作為示範。一個 Blog 會有 Post、Post 會有 Comment。

在這之前,我們先簡介怎麼生成一個簡單的 project。

rails [project name] (生成 project)

會在你現在的工作目錄下產生 rails project 需要產生的檔案。

script/server (運行 development 模式,預設開在 port 3000,可以使用 script/server -p XXXX 指定埠號。)

 

此時打開你的瀏覽器,可以看到預設的 Rails 畫面。( 此時的歡迎畫面檔案,是 public/index.html )

 

那麼如何將歡迎畫面,改成我們所需要指定的頁面甚至是指定的 Controller 呢?

先前提到這一章的主旨是建立一個 Blog,那麼我們就先從建立 Blog controller 開始。

script/generate controller [controller_name]

 

rails 的 route 規則是由 config/routes.rb 控制,要讓主頁面改指到 Blogs 下,我們需要將 root 指定為 blogs。

 

當然,別忘記把 public/index.html 砍掉

打開  config/database.yml,設定一下 databae。( 我個人偏好 mysql,在此以 mysql 作為示範。需注意的是 mysql socket 位置隨作業系統不同,如果是 BSD / MacOS,socket 多半在 /tmp/mysql.sock、Linux 多半在 /var/run/mysqld/mysqld.sock。)

再次打開 http://localhost:3000。woops..!!

 

看起來我們忘記定義在 Blogs 裡定義 index 這個 action 了。(預設會尋找 index 這個 action,並執行動作)

再打開瀏覽器,woops..!! 看起來定義了 index 這個 action 還不夠,還需要填入 index 需要的 view。

那就作一個 view 吧。手動生成一個 blogs/index.html.erb。

 

OK,現在終於可以成功的看到了畫面。

 

----

也許你會好奇 views 的 layouts 資料夾的作用。

 

這裡說明一下,其實 layouts 的作用是全域 Template。

application.html.erb 是全站的 view template,blogs.html.erb 就是 針對 Blogs 這個 controller 的 view template。一般而言,所有的 controller 都是套用 application.html.erb,但是若有針對 controller 的 view template 存在的話 (例如 blogs.html.erb),則會 load 該 template。

 

一般而言,創立一個 project 之後,都會手動先作一個 application.html.erb。

 

rails 發表在 痞客邦 留言(0) 人氣()

這一章我們要講的是 Rails 目錄的結構。

rails [project_name] 後會產生一個 project_name 的目錄夾

裡面包含了以下檔案



app/

 


Controller / Helper / Model / View 的檔案放在這裡。

以圖示簡單講解 MVC 運作的概念。

 


config/



放置一些 config file。

database.yml 是 db server 的設定
routes.rb 控制 path
enviroment.rb 與 enviroments/*.rb 環境設定( production / test/ development)

mongrel_cluster.yml (如果你是用 mongrel_server,設定檔也是丟這裡)


db/

 

schema.rb 記錄目前 database 的 schema 狀態,而 migrate 裡面放置的是 db migrate 檔,
Rails 相當方便的一點是,寫好 migrate 可以自動產生相對應的 db 欄位 / 對欄位打 index / 刪除欄位..等等。


doc/

沒啥作用,你可丟一些開發文件進去。

 

lib/

自己寫的一些 library。

比如說 你看到別人寫好一隻方便的 library,丟進 lib/ 下 就可以在 Rails 底下直接使用。

yahoo bbauth 我也是把該支 rb 檔,丟到 lib/ 下,在 account_controller 下 直接取用的。

log/


運行的 log 檔都在這裡



public/


一些靜態檔案。

http://localhost:3000/stylesheets/application.css
對應的位置是 public/stylesheets/applcation.css

當然使用者上傳的檔案也是建議放在這裡。上傳檔案(plugin : attachment_fu ) 的教學有空我們會在後面幾章提到。

script/

 

script/console :console 模式,類似 irb,相當方便。
script/generate:可以拿來生 model , controller 等等...
script/server  :跑起 rails 內建的 web server,原先的 weblrick 在Rails 蠻後面的版本被取代為 mongrel。通常只拿來 development 用。

production 環境常見的作法是用 mongrel_cluster 叫起一堆 mongrel,前面用 apache 或 nginx 做 reverse proxy。

通常寫 daemon,我也會丟在 script 下。

test/

就是寫 test case 的地方。當然我很懶惰,很少寫 test case,所以這邊有空想到再補好了...。

tmp/

 

這些目錄名稱直觀的說明了一切,一些臨時的 pid , session , cache , sockets 都丟這裡。

vendor/

Rails 最為人稱道的就是 plugin,很多常見的功能經過這幾年發展之後,
已經有許多好心人寫好了方便的 plugin。(比如認證、上傳圖片...)

只要 script/plugin install [plugin_repositry] 照著 README 就可以輕鬆的 implement。

Ruby 其實也有類似 Perl 的 CPAN 的機制,稱之為 gem。
通常在寫 rails 時有時候也會用到這些好用的 gem。

但是,這些 gem 有時候並不是 well-work 的,有時需要針對 bug 或者是自己想要實現的一些特殊機制上 patch。
但是對 system 安裝的 gem 打 patch 實在是一件很蠢很暴力的事。

這時候也可以 gem unpack [gem_name] 到 vendor/plugin 下。
這樣 rails require 的 gem 就會去吃你 patch 過的特製版。

- rails/ (通常是沒有此目錄的)

Rails 是一個不斷發展中的 Framework。我們透過 gem 安裝的往往是穩定的版本。但是,trunk 中的 rails 有時候會有一些神秘好用的 feature。

或者是你的 application 需要運行在一個特製版本的 rails 下。

這時候可以把 trunk 版 / 特製版 的 rails 放到 vendor/rails 。
運行的就是自訂版本的 rails。

rails 發表在 痞客邦 留言(0) 人氣()

這一篇有幾個重點,大致上是回答上一篇文章提到的三個問題。

具備怎樣的知識比較適合開始學習 Rails 呢?
我的建議是至少懂這幾樣:

* 熟悉 Linux / FreeBSD 操作
* 使用過 Linux / Apache / MySQL / PHP 這一套組合開發過網站(略懂也可)
* 寫過一點 Perl、Ruby
* subversion
* vim

如果有 Macbook 那更讚。往後你會感受到 Textmate + svn + capistrano 組合的威猛。

 

至於如何開始上手 Rails 呢?
有幾本書我覺得是可以買的。

1. 博碩的那兩本翻譯 Ruby 中文書。一本是基礎、一本是秘技。

Rails 程式碼易懂,然而寫 Rails 還是需要瞭解 Ruby 語法,而熟悉 Ruby Magic 可以寫出幫助你寫出更簡單敏捷的程式碼。

2. AWDR 2 or AWDR3(Beta中)+ The Rails Way

聖經中的聖經,我個人覺得就直接衝 AWDR3 了,http://pragprog.com 有 beta book。因為 AWDR3 cover 了 Rails 2 ,這是我推薦的原因。

3. 一本帶你練 Project 的書。

中文:Ruby on Rails 專業網站案例實作 (這一本是教音樂商店)


英文書:Pratical Rails ( Social Network Sites) (這一本是教寫社群網站)


當然這兩本練 Project 的書都是 Rails 1.2.6 版本的。

如果現在要學習 Rails,我還是傾向直接寫 Rails 2.x 版本。

然而我推薦的用意,是在 document 不是很全的情況下,練 project 看 document 整個 go trouuh 一遍,幹出一個 project,通常是練 framework 最快的一個方法。


因此在接下來的幾篇,我會簡介 Rails 目錄結構。以及實際以一個 Blog 的開發,做為瞭解 Rails 2.x Web Application 的範例。

目前預計的主題至少會有:

Rails 目錄結構
Blog 會有 Post (CRUD)
Post 會有 Comment(巢狀結構)
Model Validation
分頁( will_paginate)
權限控制 ( restful_authenication)
以 Yahoo BB 介紹 lib/ 下 library 的用處。
capistrano deploy 教學

rails 發表在 痞客邦 留言(0) 人氣()

身為一個 Rails Developer,常被人問的問題通常是這幾個。

(1) 請問要怎麼開始上手?
(2) 請問有沒有推薦的書?
(3) 請問有沒有推薦的開發工具?

這些顯見都是新手亟欲求解的類型。

這一些問題,若在一年多前都還存在著近似標準答案的解答。然而隨著 Rails 在版本以及架構變遷上的迅速更迭,我已經慢慢沒有沒有自信這麼迅速的對這些問題肯定給出解答。

然而,經過這整整一年開發 Rails Application 的訓練下來,我覺得即使沒有辦法給出肯定的回答。但是對於一些開發和學習上的建議、我應該還是有辦法整理的出來。這就是寫這系列文章的初衷。

------

一般來說,Rails 給人的印象,就是「開發迅速」。然而「開發迅速」給人的下一個直覺反應就是「Rails 沒有門檻,很簡單」。

如果這樣想,就錯了。

「沒有門檻、很簡單」真的是只有 CRUD 動作(註)而已,也就是如果你要刻一個簡單的留言版。具有 Web Development 經驗的人,翻翻 Rails 書在一兩個小時,甚至十幾分鐘內就寫完是可能的事情。

但是如果要更進階,比如說要在幾小時內撰寫一個可以供很多人開設自己留言版的站台、權限控制、巢狀結構、Group 權限等等。那就是除了 Web Developemt 經驗外,還要加上瞭解 Ruby Magic、 Rails Magic、自己沒事累積了一些程式碼,才有辦法辦得到的事。

一些 Rails 開發者的程式還卡在 Rails 1.x,除了因為 Rails 2.x 沒有中文書推廣的因素外,Rails 2.x 的 Web Application 撰寫,實際上是需要對整個 Rails 框架要有一點進階程度上的認識。

(因為寫 Rails 1.x 可以像寫 php 那樣蠻幹,所以基本上會寫 php 就...)

除去 SEO 的影響,框架上大幅度的改版及棄用語法,即使 Rails 2.x 相當美妙,但也不是誰都願意、有辦法改版上 Rails 2.x 的。


因此,走筆至今。我要先給的第一個建議是:

學習 Rails,必須建構在你有 Web Development 的 sense 以及 expierence 的前提上。沒有這些基礎,寫 Rails 並不會比寫 php 更快樂更容易。

寫 Rails 很快樂,CRUD 很簡單,但 Rails 並不是只有 CRUD 和 scaffold (註)而已。


註:CRUD is Create / Read / Update / Delete , DBMS(資料庫管理系統)中必要的4個基本功能
註:在 Rails 裡下針對 model scaffold 指令,可以迅速打出一個 CRUD 的介面。

rails 發表在 痞客邦 留言(0) 人氣()