2010-09-08 6 views
24

el códigoEn Rails 3, responda_y formateando.todos funcionan de manera diferente que Rails 2?

respond_to do |format| 
    format.html 
    format.json { render :json => @switches } 
    format.xml { render :xml => @switches.to_xml } 
    format.all { render :text => "only HTML, XML, and JSON format are supported at the moment." } 
end 

la anterior funcionará en Rails 2.2.2. Pero en Rails 3, obtener controller/index.html o index en el navegador caerá en la última línea: "solo el formato HTML y JSON son compatibles en este momento".

El único documento rieles que puedo encontrar en esto es

http://api.rubyonrails.org/classes/ActionController/MimeResponds/ClassMethods.html#method-i-respond_to

el cual la corriente únicos estados:

respond_to :html, :xml, :json 

pero necesitan plantillas separadas para JSON y XML, y no puede manejar el caso "solo el formato HTML y JSON son compatibles en este momento".

Respuesta

3

Puede ser útil para ver este episodio de railscasts, que ilustra los cambios a los controladores en Rails 3 y en particular los cambios a la clase de respuesta (poniendo respond_to en la clase del controlador y solo usando responder_con @object en el acción):

http://railscasts.com/episodes/224-controllers-in-rails-3

43

en rails3 usted escribiría:

respond_with(@switches) do |format| 
    format.html 
    format.json { render :json => @switches } 
    format.xml { render :xml => @switches } 
    format.all { render :text => "only HTML, XML, and JSON format are supported at the moment." } 
end 

Pero esto sólo funciona en correspondencia con un bloque respond_to en la parte superior de la FIL e, detallando los formatos esperados. P.ej.

respond_to :xml, :json, :html 

Incluso en ese caso, si alguien pide por ejemplo el formato js, el bloque any se dispara.

Usted también podría seguir utilizando el respond_to solo, de la siguiente manera:

@switches = ... 
respond_to do |format| 
    format.html {render :text => 'This is html'} 
    format.xml {render :xml => @switches} 
    format.json {render :json => @switches} 
    format.all {render :text => "Only HTML, JSON and XML are currently supported"} 
end 

Espero que esto ayude.

+0

Creo que la llamada to_xml es superflua. El respondedor predeterminado de Rails 3 debe llamarlo automáticamente. – dogenpunk

+1

format.any tiene el mismo problema que format.all para mí. es esto posiblemente relevante: http://blogs.thewehners.net/josh/posts/354-obscure-rails-bug-respond_to-formatany – dreeves

+0

@dogenpunk: eso es correcto, por supuesto. Edité mi respuesta para mostrar eso. También agregué un ejemplo puro de "responder a" (y una aclaración adicional). @dreeves: bueno para mí, simplemente funciona, el blogpost que mencionas es antiguo en Rails-terms :) – nathanvda

0

El siguiente funciona para mí. Creo que tienes que especificar explícitamente la parte "render" para html o usará el formato. Any.

respond_to do |format| 
    format.html { render :html => @switches } 
    format.json { render :json => @switches } 
    format.xml { render :xml => @switches } 
    format.all { render :text => "we only have html, json, and xml" } 
end