Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rails 3 - How to render a PARTIAL as a Json response

I want to do something like this:

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

Is there a way to do this? render a Partial inside a JSON object? thanks

like image 499
AnApprentice Avatar asked Jan 26 '11 22:01

AnApprentice


2 Answers

This should work:

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

Notice the render_to_string and the underscore _ in before the name of the partial (because render_to_string doesn't expect a partial, hence the :layout => false too).


UPDATE

If you want to render html inside a json request for example, I suggest you add something like this 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 

Then you can just do this in your method:

def upload   with_format :html do     @html_content = render_to_string partial: 'messages/_attachment', :locals => { :message => @message }   end   render :json => { :attachmentPartial => @html_content } end 
like image 87
mbillard Avatar answered Oct 04 '22 11:10

mbillard


This question is a bit old, but I thought this might help some folks.

To render an html partial in a json response, you don't actually need the with_format helper as explained in mbillard's answer. You simply need to specify the format in the call to render_to_string, like formats: :html.

def upload   render json: {      attachmentPartial:        render_to_string(         partial: 'messages/attachment',          formats: :html,          layout: false,          locals: { message: @message }       )   } end 
like image 44
jibai31 Avatar answered Oct 04 '22 10:10

jibai31