為什麼 Rails 101 的新版拖這麼久...

Published on:

這篇文章主要是寫給有興趣知道為什麼 Rails 101 區區一兩百頁,但是為什麼更新拖這麼久的關係。

寫這本書的難度非常非常之高,所以最後一刻我決定這本書如果不漲價,實在是....

寫作工具

首先是寫作工具的問題,技術書籍寫作門檻非常的高。我在 [電子出版] Rails 101 的兩年來的一些數據 提過:為了寫這本書,我換了好幾個平台,重寫了好幾遍。最後才選定 Leanpub 作為最後一次發佈的平台。

新 Feature 的問題

Rails 101 第一次的發佈是在 2011 的 6 月。那時候 Rails 是 3.0。

坦白來說後面的更新帶給我很大的壓力,主要是 Rails 3.0 -> Rails 3.2 新增了很多主題,有一些主題很不穩定(如 asset pipeline, strong parameter),不知道如何以「簡單的方式」更新進去書裡面。

Rails 安裝環境 的問題

再來就是安裝環境,這其實是最討人厭的,MacOSX 上的架構從 10.6 -> 10.7 -> 10.8 -> 10.9,每一個世代的 command line 安裝方式都不一樣,而且竟然還從 gcc 改到 clang。而 10.6, 10.7, 10.8 是「並存」的作業系統。我完全對如何寫一個「不太會爆炸的 ruby 環境建構」沒什麼頭緒。

Yehuda Katz 當時要解決這個問題的野望 rails.app,到現在還沒 Official Release : http://www.kickstarter.com/projects/1397300529/railsapp/posts。而這兩年時間,Rails 從 3.0.0 衝到了 4.0.1,Ruby 從 1.8.7 改朝換代到 2.0.0。

同樣的問題也發生在 production deploy。從單一版本 ree 到 rvm 到 rbenv ...。很難為了系統環境變一次,書就改版一次。

Ruby 與 Rails 改朝換代的 dependency hell

對舊開發者沒太大影響

說實話,Ruby 與 Rails ,自從 Ruby 進了 1.9.2+ 之後,Ruby syntax 接近相當穩定。Rails 3.2 以後,Rails syntax 也很穩定。基本上如果單就「內容」來說,沒什麼要改的。所以如果已經是 Rails developer,根本沒什麼影響。

版本跳躍的連鎖反應

但問題就在於 Ruby 1.9.2 -> Ruby 2.0.0 與 Rails 3.2 -> Rails 4.0 的 jump 版所造成的 dependency hell。這本書是一本教學書,作者(應該)有責任讓這本書的程式碼能動。

Ruby 版本的跳躍,導致了很多 gem 改版,因為 require 的方式與位置不一樣了。加上 Rails 3 -> Rails 4 的 gem 架構不太一樣,gem 之間可能有 dependency 關係...

所以 Rails 101 v2 裡面首次發佈的 pdf 裡面 Gemfile 裡面幾乎都是 github 上的 trunk 版。讓特定版本在當時那個特定時間點會動...

熱門 Gem 偷改版

因為 Framekwork 改主板號 3->4 ,所以熱門 gem 也跟著流行改自己的主板號,同時偷偷「大改版」。如 simple_form 跳到 3.0。devise 也跳到 3.0。

這跳一個版號通常就是架構大變更。然後有一些 hack 就不能用了 -_-

Compass 與 Sprocekt 間無止盡的戰爭

compass 傳說中與 sprocket (asset pipeline 底層),兩個官方 team 素來有世仇。(只要你解過 asset pipeline 上的 issue, 追過幾串討論串, 你應該會聞得出來那種火花味, 雙方應該接近見面可能會打起來...)

但問題是:兩個都是超熱門套件。sprocket 佔了 Rails 內建的先天優勢,一直偷整 compass。但 compass-rails 幾乎也是一個 Rails developer 幾乎離不開的 gem。為了「與 Rails4相容」,從 Rails 4.0.0beta1, Rails 4.0.0rc1, Rails 4.0.0 official,compass-rails能夠動的版本,「完全不一樣」,甚至只存在討論串上的某個 fork 的某個 rev。

不過這不是 compass-rails 的錯,因為耐心追討論串你會發現從頭到尾都是 sprocket team 接近在整人。

Anyway 這問題不解,在 Rails project 不要說 deploy 了,連掛 compass 都有困難...

書裡面只要有 compass-rails,我就要保證它能動...-_-

Deploy Setting

sprocket 改了底層,於是在 deploy 時一些設定完全與 Rails 3 不同。從 Gemfile 擺放位置的順序到 production.rb 上的設定完全不一樣...

為了解決這些問題我花了好幾天時間在追討論串並且想辦法找 fix。

新觀念的引進與 Hack

Rails 3.0 -> Rails 4.0 間引進了一些新觀念以及新寫法,如

  • Asset Pipeline
  • Strong Parameter

這些都是其他 Framework 聞所未聞的設計,要在相當短的篇幅裡面寫出一篇 introduction,難度很高...
(還好以前寫過一些文章)

新觀念的引進與熱門 Gem 的糾葛

Strong Parameter 現在是預設的設計,但是會與 devise 衝突,解法是在 devise 的 issue 上翻到的...-_-

還要解釋為什麼要這樣繞過去...

舊的熱門 Feature 被改成詏手的 syntax

scope 從原先漂亮的 scope :recent, order("id DESC") 改成 scope :recent, -> { order("id DESC"}

link_to("Destroy", post_path(post), :method => :delete, :confirm => "Are you sure ?")

改成

link_to("Destroy", post_path(post), :method => :delete, :data => { :confirm => "Are you sure ?" } )

routing 的 secure 設計

以往 Rails 3

  match "/pages/welcome", :to => "pages#welcome"

改成

  get "/pages/welcome", :to => "pages#welcome"

這些變更有些可以穩定支援,跳 warning,有些 Rails 4 直接禁用 或行為不同。

Summary

而這些的 solution 都要去翻幾十個 issue 才知道發生什麼事,找出一個可以動的版本。然後在自己實驗的 project 上跑步驟確認這些 hack 真正能動,再整理成一本「不會爆炸」的指南。

嗯,我想我真的在做良心事業...-_-

全球應該沒人像我這麼神經病了。