views:

463

answers:

2

In one of my rails controller, I must respond to several types of formats, so I use the typical respond_to chain:

respond_to do |format|
  format.html   { ... }
  format.mobile { ... }
  format.jpg  { ... }
  format.xml  { ... }
  format.js   { ... }
end

Usually that the { ... } part is repeated on several formats. What is the best way to stay DRY on this case? On an scenario in which html, mobile and xml have a "repeated" action, I'd like to do something like this:

respond_to do |format|
  format[:html, :mobile, :xml] { ... }
  format.jpg  { ... }
  format.js   { ... }
end

Thanks a lot.

+2  A: 

Can you give an example of the repetition you're seeing?

You could always do something like this:

respond_to do |do|
  format.html { common_stuff }
  format.mobile { common_stuff }
  format.xml { common_stuff }
  ...
end

protected 

def common_stuff
  ...
end

I think something like that could be refactored to (I probably got this wrong as I always forget how to use a method as a block:

[:html, :mobile, :xml].each { |f| format.send(:f, lambda{ common_stuff }) }

Having said that, I think you're better off with the former as it's more explicit.

jonnii
I ended up using a common function. It looks simpler than the lambda stuff. Thanks for sharing this.
egarcia
+2  A: 

Have you tried format.any(:html, :mobile, :xml)?

raf
I had the opportunity to attack this problem again recently. This solution works! So it is now the best answer. Updating (sorry jonnii)
egarcia
nice to know my answer was useful! see you around here
raf