Rails 2.0 搶鮮版釋出!

哇嗚~又要學新東西了嗎? XDrz

今天 RoR 官方宣佈了 Rails 2.0 Preview Release 的消息。不過同時也公告了,在 2.0 正式版本釋出前,會先釋出 Rails 1.2.4 版來修正一些 Rails 1.2 版的 bug 及過時用法的警告。

至於 Rails 2.0 加入了什麼新東西呢?

  • Resource
    1. 新的 REST URL: 比方說 /people/1;edit 變成 /people/1/edit
    2. 在 route 中增加 namespace 的支援,引用官方的例子:
      [code lang="ruby"]
      map.namespace(:admin) do |admin|
      admin.resources :products,
      :collection => { :inventory => :get },
      :member => { :duplicate => :post },
      :has_many => [ :tags, :images, :variants ]
      end
      [/code]
    3. resource-based controller,幫助你在設定 REST route 時,可以像 ActiveRecord 那樣建立關係,比方說:
      [code lang="ruby"]
      # /avatars/45 => AvatarsController#show
      map.resources :avatars

      # /people/5/avatar => AvatarsController#show
      map.resources :people, :has_one => :avatar
      [/code]

  • Multiview

    在 actionview 的部份導入更多的 template,以區別不同的格式,格式長成這樣:action.format.builder,以下是幾個例子:

    1. xxx.html.erb: 就像過去的 rhtml,表示格式是 HTML,而 rendering engine 是 ERb。
    2. xxx.atom.builder: 主要用來產生一個 mime type 為 application/atom+xml 的輸出。

    而且你可以自己設計自己的 mime_type (原文中教了如何設計 for iPhone 的格式)及 template。

  • 利用 Record 的 identification 來產生 URL。

    比方說你可以直接使用:
    [code lang="ruby"]
    p = Person.find_by_name('ericsk')
    link_to p.name, p
    [/code]
    這樣的方式來產生 URL 指到這筆 record

  • 更多 HTTP 支援

    其中包括了 HTTP Authentication、cache 多個 JavaScript, stylesheet 檔案,以及讓 browser 同時開啟多個 HTTP request 以增加讀取資料(如圖片)的速度。

  • Security

    內建處理 CRSF attack 的機制,以及改寫了 TextHelper#sanitize method(從黑名單轉為白名單)。另外就是只支援 HTTP cookies,表示你別想再用 document.cookie 拿到東西了 :p

  • 例外處理

    過去處理例外情況只能用 begin ... rescue ... end 來作,現在可以把處理的動作寫成 method,然後在 controller 加上 rescue_from :method 關鍵字來處理,例如:
    [code lang="ruby"]
    class PostsController < ApplicationController rescue_from User::NotAuthorized, :with => :deny_access

    protected
    def deny_access
    ...
    end
    end
    [/code]

  • ATOM helper
  • Query cache for ActiveRecord
  • Migration 的新寫法

    直接看官方的例子,原本是寫成這樣:
    [code lang="ruby"]
    create_table :people do |t|
    t.column, "account_id", :integer
    t.column, "first_name", :string, :null => false
    t.column, "last_name", :string, :null => false
    t.column, "description", :text
    t.column, "created_at", :datetime
    t.column, "updated_at", :datetime
    end
    [/code]
    現在可以寫成:
    [code lang="ruby"]
    create_table :people do |t|
    t.integer :account_id
    t.string :first_name, :last_name, :null => false
    t.text :description
    t.timestamps
    end
    [/code]

  • XML in, JSON out

    ActiveRecord 現在可以利用 from_xml 來讀取輸入的資料,而且可以用 to_json 來輸出 JSON 格式的資料。

  • 整理過的 ActiveRecord

    一堆 acts_as_XXX 全部移到 plugin 去了(不再內建),然後預設的 adapter 只留下 MySQL、SQLite 及 PostgreSQL,要其它 DBMS 的 adapter 可以去 GEMS 裡找找看有沒有 activerecord-XYZ-adapter

  • 拿掉 :with_scope
  • ActionWebservice out, ActiveResource in
  • ActiveSupport

    加作 Array#rand 及 Hash#except

  • Action Mailer
  • Rails debugger
  • 切割設定檔

    預設的設定值留在 config/environment.rb,而自己的設定都放在 config/initializers 下的 inflections.rbmime_types.rb

  • 可以設定 plugin 載入的順序
  • code 的改進

依照 David 的建議,如果你的 rails app 在 Rails 1.2.3 (Rails 1.2.4 會有更多的 deprecation waring) 的環境中沒有任何的 waring,同時也願意移植到 Rails 2.0 環境的話,是可以考慮「升級」,直接利用:

# gem install rails --source http://gems.rubyonrails.org

就可以安裝 preview release 了。

準備要踏入 RoR 界的朋友,可以考慮一下準備直接學習 Rails 2.0 了~

  • CFC

    Rails 2.0的Migration令人亮眼
    這也是我最愛Rails 2.0的地方
    不過,新的Migration表面上看起來還是有個缺點
    我不知道DHH有沒有考慮到這樣
    我直接列個例子
    t.string :first_name, :last_name, :null => false
    如果我first_name限制10,last_name限制20
    我就得拆開了…
    所以我是想說
    :limit => [:first_name => 10, :last_name => 20]
    或許這是個方式
    其他像是:default也能適用
    但是我不知道新的Migration是不是可以這樣玩

  • @CFC
    就算不能這樣玩,你也可以手動去改 migration 的 code 讓它可以 😛

  • CFC

    [quote comment=””]@CFC
    就算不能這樣玩,你也可以手動去改 migration 的 code 讓它可以 :P[/quote]
    yeah
    有這打算
    不過#rubyonrails的人跟我說 不要這樣作會比較好lol
    反正等Rails 2.0 stable release後
    我再來自己玩玩吧