Strategy design pattern vs partial

Andy,

I think you understand my question. The answers range in complexity from using partials, as you suggest (that’s what I’m doing now), to using an Abstract Factory to choose the correct Strategy in the various places in the application it’s needed.

The Abstract Factory would be the ideal solution, since it would centralize all the various views, rather than scattering them in various view directories.

However, at this stage, there are actually only a few partials for each type of dealer. So after due consideration, I think the partial approach, plus a few notes that will remind me what partials need to be created for each dealer, will do for now. If it gets too hairy to manage this way in the future, I can always refactor.

Thanks for confirming that I’m on the right track.

Brgds: John

John,

I didn't meant to be dismissive at first. Really, my original post *was* a strategy of sorts, just one that relied on the class of the dealer. It's more interesting than that so I've not been able to get it out of my mind this afternoon. I can think of three ways you might handle this:

1. Namespacing. In Rails 2.x you can use the new map.namespace ... method to namespace your paths. By doing that you could have a dealer_car_path, etc. What I believe you could do is namespace those controllers that need their own views while leaving the generic ones in the 'default' namespace. The namespaced controllers could then be restricted to use controllers in their namespace and the default namespace. In a sense, the namespacing provides your strategy and you only have to pick the correct namespace on the dealer's landing page. As a bonus, all the namespaced views/controllers would end up in a common subfolder (ie., everything in the 'car' namespace in the app/views/cars/xxx folders).

2. View helpers It seems that the natural way to introduce the strategy methods would be by mixing in a module. Views already have modules mixed in... that's what the helpers are all about. What I believe you could do here is render a default view (show.html.erb) and allow that view to invoke a helper method. The key would be to only include the appropriate helper method. What I'd suggest would be to keep these helpers in that were related to the controller name but not directly named after it. A ListingsController, for example, might get auto_listing_helper.rb and boat_listing_helper.rb. You'd use a before filter that would include a call like

helper "#{strategey}_listing"

The helpers could then be responsible for injecting the appropriate partials.

3. Controller helpers This is a variant on 2. This time you'd write modules that encapsulated the strategy for dealing with a particular type of dealer for each controller. Then you would use a before filter to inject the controller methods into the controller.

def choose_strategy   self.class.include( --pick your strategy module-- ) end

It's possible that the action may need to be part of the controller before the before_filter fires, so you might need to have the show method (e.g.,) delegate it's response to the mixed-in functionality rather than implementing it fully in the module. The main advantage that you'd gain here would be the ability to do different data lookups if necessary. You'd also have a fairly clean way of deciding what partials to include in your view since you could pass that to the view through instance variables.

HTH, AndyV