12/12/2006

Grouping Controller

昨天在看Agile Web Development with Rails 第二版時,發現到 0.14 -> 1.1 之間果然加入了許多東西,舉個例子,Grouping Controller 就是一個我一直沒發現到的好用小技巧。

當你在開發 Rails 程式的時候,你會發現 Controller 數量會漸漸變大,同一個 Controller 底下的 Action 數量也會漸漸大起來,而這個問題就很容易造成困擾。另外我們會發現到一些特質,就算很多功能是屬於同一個 Controller ,他們底下某些 function 卻是有自己的族群,這時候我們要切成兩個 Controller 也不是,放在同一個 Controller 也略嫌冗長。

這時候就要使用 Grouping Controller ,你可以使用階層式的 Controller 來分類這些 action。

舉個例子吧,我們要寫管理介面當中管理書籍的頁面
ruby script/generate controller Admin::Book
這個會產生
app/controllers/admin/ 這個資料夾
app/controllers/admin/book_controller.rb 這個 Controller
app/views/admin/ 這個資料夾
app/views/admin/book/ 這個資料夾
本身 admin 只是母分類,只是在 controller 跟 view 當中多一個目錄來作分類,真正可以 access 到的是 book_controller.rb 這個 controller 跟相對應的 action。而仔細看 book_controller.rb 裡面, Controller 宣告的寫法也改成
class Admin::BookController

這個樣子。而你要 access 到 Grouping Controller 的 action1 你必須使用
http://url.com/admin/book/action1
這樣的使用方式。除此之外使用方式就跟原來一模一樣。

我本身開發程式的時候,發現到我這方面的 Controller 數量成長不大,並沒有特別需要這個技巧的理由。不過如果你們程式的寫法造成大量的 Controller 數量,或是 action 數量爆多。你可以考慮導入 Grouping Controller 來加強你的結構化。

Update :根據這個連結 , 這個作法並不被鼓勵

Putting Controllers in Namespaces

This is really more trouble than it’s worth. You run into all sorts of crazy errors if you do this and you’ll be confused and frustrated. You’ll then ask other people about it and they’ll either blow you off for using namespaces with controllers or procede to get confused and frustrated as well. Then you’ll say, “I with I had listened to Kevin and Chris”. If you want /admin/some_controller as an URL that’s fine. Use the routing that’s built into rails.

如果你有類似的需求 , 可以在用 route 去解決 .

延伸閱讀
  1. Controller Inheritance in Rails
  2. HowtoSensiblyOrganizeControllers
  3. Guide: Things You Shouldn't Be Doing In Rails


5 則留言:

Sparkle 提到...

1.2又取消了吧?建议用route.rb处理

thegiive 提到...

我沒看到耶?可以留個連結嗎?

hadi 提到...

http://glu.ttono.us/articles/2006/08/30/guide-things-you-shouldnt-be-doing-in-rails

Putting Controllers in Namespaces 这一条有说到

不过我还是很好奇 "Grouping Controller" 方式下 layouts 该如何设置

thegiive 提到...

For sparkle and hadi ,
感謝你們的指正 :)

hadi 提到...

rails 2.0 中加入了对 controller namespace 的支持,或者说是“加强”才对,世事轮回啊……