Maximum Modularity with Cells and Rails Engines

Do you remember “when we were writing a reusable sidebar element”: some time ago? The sidebar used in many controllers was implemented using a “cell”: which encapsulated both assets and code in one place. Those were good times.

When needed, we could render the box with a @render_cell@ call anywhere in our app.

  = render_cell :posts, :recent

h3. Reusability With Engines

Now, imagine this sidebar box was so universally usable that you wanna use it in another project. Code is usually distributed with gems in a Ruby environment – but how does that work with partials, helpers, view code?

We got engines in Rails. We got Cells. We got gems. So let’s pack the cell in an engine gem!

“Engines”: were designed to distribute controllers, views and models between Rails projects. As an example, lots of the authorization gems around use engines for reusable login pages or password reset forms that can be used right in your project. There was no easy way for reusing partials and behaviour, though, unless you’re using cells.

h3. The Cell, Gemified.

In order to ship the sidebar posts box I first need to create a Rails engine.

$ rails plugin new sidebar --mountable

This creates a distributable directory with all the files needed to mount it into a Rails app.

As a second step we need to move the @PostsCell@ into that gem.

$ mv app/cells/posts sidebar/app/cells/

You can now include the @sidebar@ gem in any application using the @Gemfile@.

gem 'sidebar', :path => 'vendor/plugins/sidebar'

To render your reusable component, just use the @render_cell@ call as you did in the originating application.

h3. Conclusion

Damn, this conclusion came fast, but there is really not more to say. Oh, did I mention that you should update to Cells 3.8.3 for full engines support in Rails 3.0, 3.1 and even 3.2?!

Cells + Engines bring real reusability to Rails. It’s da shit.


3 thoughts on “Maximum Modularity with Cells and Rails Engines

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s