新的 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...