Rails 撞牆期新手的破關指南(上)

雖然現在學 Rails 的人很多(有興趣者可看筆者的 Rails 自學之路-Rails 簡介與自學重點),但 Rails 的世界中有許多容易讓新手感到困惑的曖昧之處,新手往往會面臨一段很長的撞牆期。本篇教學將拆解幾個容易讓新手受委屈的地方,以期讓新踏入 Rails 世界的朋友自學的更加順遂。(鄭重聲明:此處所謂的「曖昧」是以初學者的角度而言,熟悉 Rails 的邏輯後,會發現這些東西其實涇渭分明,一點都不曖昧)。

要從頭開始一個全新的 Rails 專案,少不了要以下幾個步驟。

透過 gem 裝一些套件

gem install bundler

gem install rails

用 rails 指令建立新專案

rails new My_APP

裝入專案要用到的套件(gem)

bundle install

建立資料庫

rake db:create

遙想當年初探 Rails 之時,我一行 code 都還沒寫就已經被各項指令弄得暈頭轉向了。

 

所幸,用中文整理一次的話,這些指令其實也沒那麼令人無法親近。

  • gem: gem 可以想成是 Ruby 這個程式語言的外掛管理工具。許多 Ruby 本身沒有內建的函式庫(library),會被開發者包成一個 gem ,安裝後即可使用該函式庫。就像 Chrome 本來不能查單字,裝上 Google Dictionary 的外掛後,即可在用 Chrome 瀏覽網頁的同時一邊查單字。一個 gem 就是一個 Ruby 的外掛,而管理這些 gem 的指令剛好也叫 gem。所以 gem install rails這個指令就是說「我要透過 gem 安裝管理 Rails 這個外掛」。
  • rails: rails 這個指令就是使用 Rails 這套 framework(或著說這套 Ruby 外掛)提供的各種功能。rails new My_APP 就是「我要用 Rails 提供的 new 指令建造一個新的專案」,在透過 gem 安裝 Rails 前,是無法使用這個指令的。(備註:除了gem,其實可以用其他方式裝 Rails,此處假設是用 gem 裝。總之,假如沒有用任何一種方式安裝過 Rails 的話,就不能使用 rails  指令)
  • bundle:gem 指令讓開發者可以管理本機上的 Ruby 外掛,但多人協同開發時,每個人本機上裝的 gem 可能不一樣。 bundler 這套工具,透過 “Gemfile” 規範某個專案下要用哪些 gem 、這些 gem 的版本號碼分別是多少,如此一來,開發團隊即可確定在執行某個專案時,大家的環境是一樣的(裝了一樣的gem、gem的版本都一樣)。許多非 Rails 專案也會透過 bundler 管理 gem 的版本。bundle install 即是和 bundler 說「嘿,幫我安裝我的環境,讓我的環境和 Gemfile 內定義的一樣吧!」。 install 結束後, bundler 會更新 “Gemfile.lock”,告訴其他開發者「目前最新鎖定(lock)的gem和版本長這樣喔。」
  • rake:rake 是個任務管理工具,常常需要被執行的任務可以寫成一個 rake task 丟給 rake 管理,例如rake db:create中的 db:create 就是 Rails 提供的任務。開發者使用這行指令, rake 就會盡職的完成建立 database 的任務。建立 database 雖然不是什麼艱難的挑戰,但也絕非一行指令就可以搞定的事,透過 rake 執行 db:create 這個任務,開發者可以把原本需要多行指令的事情變成一行搞定,省下的時間可以拿來喝咖啡。除了 Rails ,還有很多情境會透過 rake 簡化執行固定任務的繁雜程序。當然,你也可以把自己固定要執行的任務寫成自己的 rake task,例如把資料庫的資料輸出成csv檔
  • 開發 rails 專案少不了要和資料庫系統( database system )互動,為了用 Ruby 和資料庫系統互動,而不用自己進資料庫下資料庫的指令,我們會用 database adapter 和 database system 溝通,例如以 postgresql 為 database system 時 adapter 就叫 “pg”。

    adapter 的工作就是在 ActiveRecord 中讓我們用 Ruby 的語法和 database system 溝通。 adapter 和 system 是完全不同的事,安裝時當然也是要分開安裝。

    遙想當年我誤以為 adapter 和 system 是同一件事,可是在電腦前抓破腦袋都想不通為何我明明已經在 Gemfile 中裝 “pg” 了,rails server 卻跑不起來。

    結論

    開發 Rails 需要用到的指令雖然讓人目不暇給,但總結起來只有四個群組。分清楚這些群組各自的職責後,使用指令也就沒那麼令人噁心想吐了。

  • database system 和 database adapter 是完全不同的兩件事!