October 1st, 2007

哇嗚~又要學新東西了嗎? 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 的支援,引用官方的例子:
      map.namespace(:admin) do |admin|
        admin.resources :products,
          :collection => { :inventory => :get },
          :member     => { :duplicate => :post },
          :has_many   => [ :tags, :images, :variants ]
      end
    3. resource-based controller,幫助你在設定 REST route 時,可以像 ActiveRecord 那樣建立關係,比方說:
      # /avatars/45 => AvatarsController#show
      map.resources :avatars
      
      # /people/5/avatar => AvatarsController#show 
      map.resources :people, :has_one => :avatar
  • 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。

    比方說你可以直接使用:

    p = Person.find_by_name('ericsk')
    link_to p.name, p

    這樣的方式來產生 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 關鍵字來處理,例如:

    class PostsController < ApplicationController
      rescue_from User::NotAuthorized, :with => :deny_access
    
      protected
      def deny_access
        ...
      end
    end
  • ATOM helper
  • Query cache for ActiveRecord
  • Migration 的新寫法

    直接看官方的例子,原本是寫成這樣:

    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

    現在可以寫成:

    create_table :people do |t|
      t.integer :account_id
      t.string  :first_name, :last_name, :null => false
      t.text    :description
      t.timestamps
    end
  • 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</codE>。</li>
    <li><h5>拿掉 :with_scope</h5></li>
    <li><h5>ActionWebservice out, ActiveResource in</h5></li>
    <li><h5>ActiveSupport</h5>
    加作 Array#rand 及 Hash#except</li>
    <li><h5>Action Mailer </h5></li>
    <li><h5>Rails debugger</h5></li>
    <li><h5>切割設定檔</h5>
    預設的設定值留在 <code>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 了~

 

歷史上的今天

目前有 3 則留言
  1. 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是不是可以這樣玩

  2. ericsk:

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

  3. CFC:

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

我要留言
(必填)
(必填)