2010-02-03 9 views
14

En uno de mi controlador de rieles, debo responder a varios tipos de formatos, por lo que utilizar la típica cadena de respond_to:rieles - respond_to seco con acciones repetidas

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

Por lo general, que la parte { ... } se repite en varias formatos. ¿Cuál es la mejor manera de mantenerse seco en este caso? En un escenario en el que html, mobile y xml tienen una acción "repetida", me gustaría hacer algo como esto:

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

Muchas gracias.

+0

Como nota al margen, he navegado a la API respond_to (http://api.rubyonrails.org/classes/ActionController/MimeResponds/InstanceMethods.html). Dice que responde_tiene parámetros y un bloque. Tal vez la solución está ahí? – kikito

Respuesta

19

Ha intentado format.any. (html,: móvil,: xml)?

Ejemplo (añadió 2011/9/14)

Desde el Respond rails doc

que también le permite especificar un bloque común para diferentes formatos utilizando cualquiera:

def index 
    @people = Person.all 

    respond_to do |format| 
    format.html 
    format.any(:xml, :json) { render request.format.to_sym => @people } 
    end 
end 

En el ejemplo anterior, si el formato es xml, mostrará:

render :xml => @people 

O si el formato JSON es:

render :json => @people 
+0

Tuve la oportunidad de atacar este problema nuevamente recientemente. Esta solución funciona! Entonces ahora es la mejor respuesta. Actualización (lo siento jonnii) – kikito

+0

¡Me alegra saber que mi respuesta fue útil! Nos vemos por aquí – raf

+0

Agradable, no estaba fuera del formato. Alguna opción antes. –

5

¿Puedes dar un ejemplo de la repetición que estás viendo?

Siempre se puede hacer algo como esto:

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

protected 

def common_stuff 
    ... 
end 

creo que algo así podría ser readaptado a (probablemente Tengo este mal como siempre se me olvida cómo utilizar un método como un bloque:

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

Una vez dicho esto, creo que es mejor con el anterior, ya que es más explícito

+0

Terminé usando una función común. Parece más simple que las cosas lambda. Gracias por compartir esto. – kikito

Cuestiones relacionadas