2011-01-26 5 views
22

Je veux faire quelque chose comme ceci:rails 3 - Comment rendre un PARTIELLE comme une réponse JSON

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

Est-il possible de le faire? rendre un partiel dans un objet JSON? grâce

+0

Oui, vous devriez pouvoir accomplir ceci. Je pense que votre syntaxe est incorrecte cependant. Caisse: http://stackoverflow.com/questions/2088280/in-rails-how-do-you-render-json-using-a-view pour une version de travail. – raidfive

+1

la question est différente :), partielle en json, pas json en partiel –

+0

bonne prise :) suppose que je n'ai jamais essayé de cette façon – raidfive

Répondre

42

Cela devrait fonctionner:

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

Notez que le render_to_string et le trait de soulignement _ avant le nom de la partie (parce que render_to_string ne prévoit pas une partie, d'où la : layout => false aussi).


MISE À JOUR

Si vous voulez rendre html l'intérieur d'une demande json par exemple, je vous suggère d'ajouter quelque chose comme ça dans 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 

alors vous pouvez juste faire de votre méthode:

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

Juste pensé que je mentionnerais que la solution de mbillard a seulement trouvé le partiel pour moi après avoir ajouté le postfix '.html' au chemin partiel, je pense que ceci pourrait être parce qu'il employait un format de json par défaut. – Noz

+0

@CyleHunter c'est en fait un cas d'utilisation assez commun, j'ai édité ma réponse pour couvrir ce comportement. – mbillard

+0

Rails 3.2: Vous pouvez également définir le gestionnaire (haml, erb, etc.) dans render_to_string, par ex. render_to_string (partial: 'messages/attachment', gestionnaires: [: haml]) –

0

Cette question est un peu vieux, mais je pensais que cela pourrait aider certaines personnes.

Pour rendre html partielle dans une réponse JSON, vous n'avez pas besoin en fait l'aide with_format comme expliqué dans la réponse de mbillard. Vous devez simplement spécifier le format dans l'appel à render_to_string, comme formats: :html.

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