Rails3 新的 Metal 機制

2021-06-27 13:13:09 字數 2346 閱讀 7867

新的 rails3 controller 重構後,變成 actioncontroller::base < actioncontroller::metal < abstractcontroller 的繼承體系。除了 actionmailer 繼承自 abstractcontroller,讓 api 與 controller 一致之外,新的 actioncontroller::metal 更是充滿玩味。

rails2 發明 metal 原因是,有些事情不需要完整的 controller 功能,希望能夠越快越好,例如 xml/json api 等。而 rails2 的 metal 雖然非常快,但是沒什麼彈性,完全不能使用 controller 的功能,例如用 layout, template, sessions 等,基本上就跟單純的 rack middleware 沒什麼兩樣。但是在 rails3 中,可以透過自繼承 actioncontroller::metal 做出白紙般的客製 controller,可以有非常快的速度,如果有需要用到 controller 的功能,也可以任意選擇組合加入,十分彈性。

例如,我們來實作乙個超級精簡的 static controller:

# lib/static_controller.rb

class staticcontroller < actioncontroller::metal

include actioncontroller::rendering

def about

render "about"

endend

# config/route.rb

match '/about', :to => "static#about", :as => :about

總而言之,如果你在 rails3 中不需要全部的 controller 的功能,想要盡量拉高效能,有幾種推薦作法:

其中的差異就在於後兩者會在 rails route 之後(好處是統一由 route.rb 管理 url 路徑),如果繼承自 actioncontroller::metal 可以有彈性獲得更多 controller 功能。原則上,我想我會推薦 actioncontroller::metal,寫起來最為簡單,一致性跟維護性較高。

另外,還有個小玩意, actioncontroller::middleware 是 controller 層級的 rack middleware,讓你可以在放入到某個特定 controller 之中(也就是只有該 controller 使用這個 middleware)。不過呢,這個功能我到現在還沒看到任何實用的例子就是了。

最後,yehuda 提供了乙個 參考資料:

fast: through middleware inserted at 0

slwr: through middleware inserted via @use@

rotr: through endpoint sent via the router

bare: through actioncontroller::metal with self.response_body

cntr: through actioncontroller::base with self.response_body

text: through actioncontroller::base with render :text

tmpl: through actioncontroller::base with ****** render :template

layt: through actioncontroller::base with render :template with layout

real rps

fast 0.004271 2900 rack 極限

slwr 0.067029 2200 使用 config.middleware.use yourmiddleware

rotr 0.088085 2000 經過 rails route 之後

bare 0.103868 1900 使用 actioncontroller::metal 的最快速度

cntr 0.355898 1070 使用 actioncontroller::base 的最快速度

text 0.557127 825 使用 actioncontroller::base 加上 render :text

tmpl 0.639581 765 使用 actioncontroller::base 加上 render :template

layt 1.678789 375 使用 actioncontroller::base 加上 template 跟 layout

**:

rails3測試理解

why rspec?clear,concise and readable gems rspec rspec core rspec expectations rspec mocks rspec rails basics contexts describing methods running rspec...

Rails3 入門之二 什麼是rails

rails 是基於ruby語言的web 開發框架。通過每個開發者開始的時候rails做的假設,能夠使web應用程式開發更加簡單,它可以讓你寫更少的 而完成的功能超過許多其他語言和其他框架。有rails的開發經驗者說它讓web應用程式更有趣。rails是乙個比較自我的框架。它假設有乙個 最佳 的做事方...

Rails3入門之十 安全

如果你發布你的blog。那麼其他人就可以隨便修改和新增部落格了。rails提供了乙個非常簡單的http認證系統,可以非常有幫助的解決這種情況。在postscontroller裡面我們需要乙個方法阻止那些沒有授權的使用者的操作。這時候我們可以使用http basic authenticate with...