2011-08-23 7 views
5

¿Existe algo así como:RoR: ¿dos formatos de respuesta con el mismo bloque?

respond_to do |format| 

    format.html || format.xml do 
    #big chunk of code 
    end 

end 

me gustaría hacer eso por el bien de SECO.

+0

por lo qué formato quieres el bloque para regresar - HTML o XML? Puede poner toda la lógica fuera del responder_a y luego solo formatearlo html/xml al final - ¿eso ayuda? –

+0

Consulte http://stackoverflow.com/a/2430682/265940 para obtener una mejor respuesta utilizando format.any (: html,: xml) {...} –

Respuesta

22

respond_to realidad le permite especificar su bloque común para diferentes formatos utilizando cualquiera:

format.any(:js, :json) { #your_block } 
+1

En realidad, creo que esta es la única respuesta realmente útil. No pude ejecutar la respuesta "Proc" _y_ esta es definitivamente más corta y limpia. ¡Tks! – fenton

+0

Además, 'format.all' es un sinónimo de' format.any' si tiene más sentido para usted. –

1

cuando

respond_to do |format| 
    format.html do 
    #block 
    end 
    format.xml do 
    #block 
    end 
end 

o

respond_to do |format| 
    format.html { #block } 
    format.xml { #block } 
end 

usted está tomando ventaja de ruby blocks, que se evalúan como Proc. Por lo tanto, podría hacer

respond_to do |format| 
    bcoc = Proc.new do 
    # your big chunk of code here 
    end 
    format.html bcoc 
    format.xml bcoc 
end 

pero tal vez podría trasladar parte de esa lógica a su estructura de datos?

+0

Ty Alex, voy a ir con esta solución ya que puedo restringir el formato .js tiene acceso al código de format.html/xml. – miligraf

+0

Los bloques de Ruby no son Procs. Se pueden convertir de ida y vuelta, pero no son lo mismo. –

+0

@MatthewRatzloff Mi comprensión es que la sintaxis de bloque es exactamente eso: la sintaxis de ruby ​​más común para definir un cierre. Ver [https://gist.github.com/3757938](https://gist.github.com/3757938). ¿Qué son ellos entonces? Feliz de ser corregido. –

4

Se puede utilizar un formato como el siguiente:

class PeopleController < ApplicationController 
    respond_to :html, :xml, :js 

    def index 
    @people = Person.find(:all) 
    respond_with(@people) do |format| 
     format.html 
     format.xml 
     format.js { @people.custom_code_here } 
    end 
    end 
end 

que lograría lo que está buscando, si usted tiene una situación que es más complejo que me haga saber. Consulte este método article on the respond_with para obtener más ayuda.

+0

Perdóname por responder hasta ahora, la cosa es que: quiero formatear.html y format.xml compartir el mismo grupo de código, pero también tengo format.js que no quiero que tenga acceso al código de format.html o format.xml (que en este caso sería el mismo). – miligraf

+0

Utilice la versión modificada del código anterior. Si tiene alguna pregunta, hágamelo saber. –

Cuestiones relacionadas