2011-01-26 10 views
22

voglio fare qualcosa di simile:rotaie 3 - Come rendere un PARZIALE come risposta JSON

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

C'è un modo per fare questo? rendere un partial all'interno di un oggetto JSON? grazie

+0

Sì, dovresti riuscire a farlo. Penso che la sintassi non sia corretta. Cassa: http://stackoverflow.com/questions/2088280/in-rails-how-do-you-render-json-using-a-view per una versione funzionante. – raidfive

+1

la domanda è diversa :), parziale in json, non json in parziale –

+0

buona cattura :) indovina non l'ho mai provato in quel modo – raidfive

risposta

42

Questo dovrebbe funzionare:

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

comunicazione la render_to_string e la sottolineatura _ nella prima del nome della parziale (perché render_to_string non prevede un parziale, quindi la : layout => false).


UPDATE

Se si vuole rendere html all'interno di una richiesta json per esempio, vi suggerisco di aggiungere qualcosa di simile in 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 

allora si può solo fare questo nel tuo metodo:

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

Ho solo pensato che la soluzione di mbillard ha trovato il partial solo dopo aver aggiunto il postfix '.html' al percorso parziale, penso che potrebbe essere dovuto al fatto che stava usando un formato JSON per impostazione predefinita. – Noz

+0

@CyleHunter che in realtà è un caso d'uso piuttosto comune, ho modificato la mia risposta per coprire questo comportamento. – mbillard

+0

Rails 3.2: puoi anche impostare il gestore (haml, erb, ecc.) In render_to_string, ad es. render_to_string (partial: 'messages/attachment', handlers: [: haml]) –

0

Questa domanda è un po 'vecchia, ma ho pensato che questo potesse aiutare alcune persone.

rendere un html parziale in un JSON risposta, in realtà non è necessario l'aiuto with_format come spiegato nella risposta di mbillard. È sufficiente specificare il formato nella chiamata a render_to_string, ad esempio formats: :html.

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