After developing a number of applications, there were some actions I found myself performing over and over again with each new controller in each new application. With my DRY-sense tingling, I decided to do something about it and create a plugin to clean up some of those repetitive tasks that were vital but annoying to set up. Introducing Needy Controllers.
Needy Controllers takes care of your controllers’…well, needs. You can include stylesheets, javascripts, and memoized record helpers in your controllers and views with a single command, and even use filter-chain-esque options to specify and tailor to your needs. Basically, it simplifies the process of:
- Including stylesheets in your app on a per-controller/action basis
- Including javascripts on a per-controller/action basis
- Having helper functions to fetch records in common RESTful resource mappings
Installation
git clone git://github.com/mbleigh/needy-controllers.git vendor/plugins/needy_controllers
Usage
Styles and Scripts
To use Needy Controllers for styles and scripts, you simply call a “needs” option inside your controller like so:
class MyController < ApplicationController needs :styles => :standard needs :styles => :show, :only => :show needs :scripts => :behave, :except => :show def index # this action will have access to the 'standard.css' stylesheet end def show # this action will have access to the 'show.css' stylesheet # in addition to 'standard.css' # but will not have access to 'behave.js' end end
Now that you have created your behavior and style chains, you need to include them in the view. Luckily, this is exceedingly easy! Just include :needs
in your include and link tags like so:
<%= stylesheet_link_tag 'something', :needs %> <%= javascript_include_tag 'prototype', :needs, 'effects' %>
An additional benefit of the style and behavior chains is inheritance: namely, any controller that inherits from a controller with a stylesheet or javascript included using the above method will automatically have the same stylesheet and javascript included in itself. This allows you to easily set up includes that are scoped to your exact needs with as little work as possible.
Model Fetching
To use Needy Controllers for fetching records, you use it similarly, and it creates a helper:
class MyController < ApplicationController # here's a standard problem needs :record => :user, :from => :id, :as => :user end
The :from
and :as
options in this example are the defaults (:id
for :from
and :as
defaults to the name of the record). This will create a method (“user” in the example)
that will be accessible both from the controller and from the view as a helper. It will find the record with a matching ID to the URL parameter associated with the :from
option. Therefore if you had nested resources you could call it as such:
needs :record => :user, :from => :user_id
That’s pretty much it, just a few simple ways to make your coding life easier. As always, there is a Trac available for any issues and I would love to hear any feedback you might have.