原文連結

不知不覺,時間已經邁入 2009 。ihower 和我前陣子就在商量,又過了一年,我們是不是應該又要來寫一篇書單來 Update 了。

但老實講,Rails 這個框架發展至今,其實已經越來越成熟穩定了,書其實也出差不多齊了,推來推去也那幾本。想了一想,今年這篇文章我便想改轉以學習順序與開發中需要的技巧/技術為導向,推薦各種學習上的資源,來獲得更有效的進步。

* Requirement Skill

這次的學習指南,將不再策重中文書以及中文文件的推薦。相反的,因為長期以來,許多在新手求助區發問的問題,絕大多數都是 *缺乏基本常識* 以及 *看不懂 Log / 文件* 所導致。這是即使提供中文資源也無法解決的狀況。因此在前面我先直接闡述一個重點,如果學習者沒有以下 background knowledge。我會建議你直接放棄學習 Ruby on Rails。(以後會另外開篇文章解釋)

1. LAMP background / Web Development Background
2. svn / git 基本操作
3. 英文技術文件閱讀能力 / 英文 Log 閱讀能力
4. 至少會寫一種 scripting language ( Perl / Python / Ruby ...)
5. 願意花時間練習





* First Step


初期學習 Ruby on Rails 的途徑,筆者 prefer 以幾個方向開始打基礎。

1. 初步瞭解 Ruby / RubyGems / Rails / Rails Plugin 之間的關係
2. 初步瞭解 Rails 目錄結構
- 至少有辦法在 Linux 上裝起 Ruby / Rails,新增一個 project ,接起 database
3. 學習用 Rails CRUD 以及搞懂 MVC 架構的運作
- 至少有辦法寫出基本 BLOG 的 CRUD
- 透過 CRUD 的操作瞭解 Rails 的 form 以及 ORM ( ActiveRecord ) 的簡單概念
4. 初步瞭解 Rails RESTful 的概念,以及練習如何在 Rails 使用 RESTful / Non-Restful (搞懂 routes)的方式練習 CRUD
5. 初步熟悉一些常用的 plugin:Restful Authenication(認證)、Attachment_fu(上傳檔案附件)、Will_Paginate(分頁)的安裝以及使用方式。
6. 學一些 Ruby 基本的語法。





以上這一些都有辦法從 blog 或 官方 Repository 的 README ,step by step 學到,暫時不需要買什麼書。把這一些功課練完,幾乎就掌握了 Rails 的一些開發基礎技能,差不多能開始寫點有趣的小東西....

至於 Ruby 的書推薦:Ruby Programming — 向 Ruby 之父學程式設計Programming Ruby 3nd edition


* Second Step

開始開發以後要繼續念/練的東西...

1. 進階 ActiveRecord
- 學習如何下 condition、name_scope、relation、Callback

2. 進階 ActionController
- filter、filter 搭配 resource(巢狀目錄)

3. 編寫自己的 helper,操作 partial
- 學習如何用 helper,把 view 裡面的混雜的邏輯與 html 處理乾淨

4. 熟悉 routing 與 respond_to 搭配 builder
- 練到想怎麼指就怎麼指
- 學會怎麼生 RSS / ATOM / csv / json

5. Library、Gem、Plugin 的搭配使用
- 依照自己的需求上 GithubRubyForge 找適合自己的 gem / plugin ,或者上 Dzone 找 Library 搭配自己的 Application 開發。節省重新造輪子的時間。

6. RJS
- Ajax .....

7. I18n
- 學會怎麼使用與操作 Rails 內建的 I18n

8. Deployment
- Mongrel / Thin / mod_rails 的使用
- Capistrano Recipes 的撰寫

9. Mailer 與 Observer
- 寄信

10. Asynchronous jobs
- Daemon 與 Queue

11. Ruby for Rails
- 就是熟悉 Ruby for Rails XD



推薦:

Agile Web Development with Rails, Third Edition
這是 Rails 界的聖經,由 DHH (Rails 之父)主筆。內附基本開發實例,以及詳述 Rails 常用 API 。目前這本書的第三版跟進到 Rails 2.2.2 。

Rails way
新 Rails 聖經 枕頭書。看完整本絕對超熟 Rails ,可惜沒幾個人有耐性看完....XD

Ruby for Rails
這本書是專為 Rails 開發者所寫,作者特別把開發 Rails 所需的 ruby 語法和概念,搭配 rails 做整合性的講解。(才不會發生怎麼蓋高樓,卻根本不懂建築原理的情形。這樣房子會倒的啊啊啊啊....)

Deploying Rails Applications: A Step-by-Step Guide
Deploy Rails Application 的教學書籍。如果對 Deploy 策略不熟的可以買來看看補充常識。如果熟的應該看大家平常的討論應該就夠了....

Advanced Rails Recipes: 84 New Ways to Build Stunning Rails Apps
這本書強烈建議購入,每一章都精彩。比較進階的開發進巧,比如:寄信、Nested Forms、 Asynchronous jobs 的作法 大概都有提...

RJS Templates for Rails (O’Reilly shortcut PDF)
蠻不錯的 RJS PDF

Rails 2.2 Release Notes
Rails 2.3 Release Notes

Rails 本身是一個觀念與架構都進步十分迅速的 framework,只看書其實不太足夠,進度也跟不太上。加上 Rails 後來更組織了專門寫 Document 的團隊,近幾個版本的 Release Note 都寫得相當好以及清楚。Rails 2.3 的 Release Note 更簡直像一本小教書,許多 feature 以及使用方法都解釋的十分清楚。如果想瞭解新 feature,直接看 Release Note 現在是我相當推薦的方法...



下一篇會繼續寫的是如何進階 Ruby on Rails 以及推薦閱覽練習的材料...。

xdite 發表在 痞客邦 留言(1) 人氣()

解法是 unpack armailer 放在 vendor/plugin 下。

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

裝好 apache 之後,要打開幾個 module。

a2enmod proxy

a2enmod proxy_http

a2enmod proxy_balancer

另外還有一個重點:

proxy.conf 要把 Deny from all 關掉,改成 Allow from 127.0.0.1。不然會 403 Forbidden。

 

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

這個問題踩到兩三次了,主要是 ARMailer 現在沒有在更新,加上 Ruby 1.8.7 的問題多多。

跑 ar_sendmail 會爆掉,因為 argument 數量不對。

解法是把 ar_mailer unpack,然後把 action_mailer_optional_tls 的檔案 patch 過去。

copy /action_mailer_optional_tls/lib/smtp_tls.rb over /ar_mailer-1.3.1/lib/smtp_tls.rb.

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

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) 人氣()

«123