One of the things that always bothered me about Ruby on Rails apps in general and RESTful routing in general is how quickly it breaks down in the real world. You know the world with clients and designers. It’s all fine and well, your “blogs” page lists all the blogs and “blog/1″ shows the first blog entry and everything is all nice and neat and then someone insists that you have to have a tag cloud on all the pages and maybe a list of most recent comments or a blog roll. The pure and simple joy of the blogs routes loads the blogs model and displays in the blogs views all goes to hell.

Up to now I’ve had two techniques to deal with this and both of them frankly suck.

1) Have the controller load all the models that the view needs. This just reeks. The index action in the blog controller can logically load the blogs but why should it have to know that the designer put a blog roll on that page and it also needs to load those urls along with topics for a tag cloud or comments. I really hate the idea of my controller having to know about design elements when it should be controlling: namely deal with the inputs and data logically associated with that particular resource.

2) Dump all that crap into your application_controller in some filter that get run all the time. At least this is DRY but I really hate the idea of hiding this stuff away where you don’t expect it and can’t find it. When there’s something wrong and you need to address something on the blogs index page you’re naturally going to go to the blogs views/controller/model. Having some truly common stuff in your application controller (current_user) is okay but I’ve too often seen this loading of miscellaneous junk bloat the application_controller beyond reason.

Enter cells. Call em components, or widgets or blocks they’re what pretty much every real world rails app needs. Encapsulate that common element on the side into it’s own bit and then include it like a partial. But like a smart partial that loads the data it needs by itself. It take a partial from a strictly display oriented view thing and adds a lightweight controller to do the controller like stuff we need.

I’d come across cells a while ago and never used them but had a few spare minutes and decided to give it a try and that’s about all it takes. I have a feeling I’ll be using them in just about every project from now on.

Sorry, the comment form is closed at this time.

© 2011 nestoriak.com Suffusion theme by Sayontan Sinha