2011-01-26 7 views
22

quiero hacer algo como esto:carriles 3 - Cómo hacer que un PARCIAL como una respuesta JSON

class AttachmentsController < ApplicationController 
    def upload 
    render :json => { :attachmentPartial => render :partial => 'messages/attachment', :locals => { :message=> @message} } 
    end 

¿Hay una manera de hacer esto? renderizar un Parcial dentro de un objeto JSON? gracias

+0

Sí, debería ser capaz de lograr esto. Creo que tu sintaxis es incorrecta. Pago y envío: http://stackoverflow.com/questions/2088280/in-rails-how-do-you-render-json-using-a-view para una versión funcional. – raidfive

+1

la pregunta es diferente :), parcial en json, no json en parcial –

+0

buena captura :) supongo que nunca lo he intentado de esa manera – raidfive

Respuesta

42

Esto debería funcionar:

def upload 
    render :json => { :attachmentPartial => render_to_string('messages/_attachment', :layout => false, :locals => { :message => @message }) } 
end 

Aviso del render_to_string y el subrayado _ antes de que el nombre del parcial (porque render_to_string no espera un parcial, de ahí el : layout => false también).


ACTUALIZACIÓN

Si desea procesar html dentro de una petición json por ejemplo, le sugiero que añadir algo como esto en application_helper.rb:

# execute a block with a different format (ex: an html partial while in an ajax request) 
def with_format(format, &block) 
    old_formats = formats 
    self.formats = [format] 
    block.call 
    self.formats = old_formats 
    nil 
end 

A continuación, puede simplemente hacer esto en su método:

def upload 
    with_format :html do 
    @html_content = render_to_string partial: 'messages/_attachment', :locals => { :message => @message } 
    end 
    render :json => { :attachmentPartial => @html_content } 
end 
+4

Solo pensé que mencionaría que la solución de mbillard solo encontró el parcial para mí después de que agregué el postfijo '.html' a la ruta parcial, creo que esto podría deberse a que estaba usando un formato json por defecto. – Noz

+0

@CyleHunter que en realidad es un caso de uso bastante común, edité mi respuesta para cubrir este comportamiento. – mbillard

+0

Rails 3.2: también puede configurar el controlador (haml, erb, etc.) en render_to_string, p. Ej. render_to_string (parcial: 'messages/attachment', handlers: [: haml]) –

0

Esta pregunta es un poco antigua, pero pensé que esto podría ayudar a algunas personas.

dicte el html parcial en una respuesta JSON , que en realidad no necesita el ayudante with_format como se explica en la respuesta de mbillard. Simplemente necesita especificar el formato en la llamada al render_to_string, como formats: :html.

def upload 
    render json: { 
    attachmentPartial: 
     render_to_string(
     partial: 'messages/attachment', 
     formats: :html, 
     layout: false, 
     locals: { message: @message } 
    ) 
    } 
end 
Cuestiones relacionadas