Alan H.
Alan H.

Reputation: 16568

How can I render an HTML view while constructing a JSON response in Rails?

I have a controller method that returns JSON. But sometimes part of that JSON object should include a rendered, serialized HTML view. So my controller method has a line like this:

html = render_to_string :partial => 'foo/bar'
# ...
render json: {x: 'y', html: html}

But that fails because Rails is only looking for JSON views!

ActionView::MissingTemplate (Missing partial foo/bar with {:locale=>[:en], :formats=>[:json], :handlers=>[:erb, :builder, :coffee, :slim, :haml]}. […]

How can I solve this?


Update: I have gotten one "level" of layout to render_to_string as html using the below syntax, but the same error persists when that layout renders its own partials!

html = render_to_string :partial => "foo/bar.html.haml"

Surely there’s a solution here, right?


Update 2: render_to_string :action => 'method_in_this_controller' seems to be doing the trick.

Upvotes: 1

Views: 2088

Answers (3)

anthony
anthony

Reputation: 315

Repeating Yanhao's answer because I ran into this exact problem and its what worked for me.

try:

html = render_to_string :partial => 'foo/bar', :formats=>[:html]

Upvotes: 2

Chloe
Chloe

Reputation: 26264

Are you sure you have a file 'apps/views/foo/_bar.*'? I was able to render HTML as a JSON parameter with How do I render a partial to a string?

respond_to do |format|
   format.html { redirect_to post_path(post) }
   format.js { 
     render json: { 
       error: flash[:error],
       content: (render_to_string partial: '/comments/comment', locals: {comment: comment}, layout: false )  
     } 
   }
end

Upvotes: 0

oivoodoo
oivoodoo

Reputation: 794

I am writing something like that in my action:

def show
  ...
  respond_to do |format|
    format.js { render :json => data }
  end
end

May be it will help you.

Upvotes: 0

Related Questions