2008-11-18 4 views
14

Tengo un FooController que responde a HTML y consultas JS (Ajax):¿Cómo incluyo HTML en una respuesta de JS Rails?

# app/controllers/foo_controller.rb: 
class FooController < ApplicationController 
    layout 'foo' 
    def bar 
    respond_to do |format| 
     format.html # foo/bar.html.erb 
     format.js # foo/bar.js.erb 
    end 
    end 
end 

Las plantillas para apoyarlo:

# app/views/layouts/foo.html.erb: 
<html>...<%= yield %>...</html> 

# app/views/layouts/foo.json.erb: 
<%= yield %> 

Y una plantilla de AJAX en el que quiero rendir un parcial:

# app/views/foo/bar.js.erb: 
dojo.byID('some_div').innerHTML = "<%= escape_javascript(render(:partial => 'some/partial')) %>"; 

Si la plantilla JS solo tiene el viejo y simple JS en ella (como alert('hi');), que utiliza mi plantilla JS. Sin embargo, cuando puse el render (: parcial), hace que toda la respuesta use la plantilla HTML, lo que significa que ya no es válida.

Una posible solución es utilizar una función para el diseño:

class FooController < ApplicationController 
    layout :choose_layout 
    ... 
    private 
    def choose_layout 
    return nil if request.xhr? 
    'foo' 
    end 
end 

Pero mi versión debe trabajo! ¿Por qué no?

+0

Creo que la razón por la que no funcionó fue un pequeño error: tenía una plantilla .json.erb, pero ninguna .js.erb y ninguna .erb por defecto. –

Respuesta

7

La más reciente Railscast covers this topic (using jQuery).

No estoy viendo en la que podría ir mal, pero aquí hay un snippit del Railscast que funciona muy bien para rendir un parcial:

// views/reviews/create.js.erb 
$("#new_review").before('<div id="flash_notice"><%= escape_javascript(flash.delete(:notice)) %></div>'); 
$("#reviews_count").html("<%= pluralize(@review.product.reviews.count, 'Review') %>"); 
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>"); 
$("#new_review")[0].reset(); 

¿Dónde se almacena el Javascript? ¿Tienes un Application.js en el que guardas las cosas? Si es así, ¿está incluyendo "dojo" antes de "aplicación" en su javascript_include_tag?

1

Pruebe lo siguiente;

class FooController < ApplicationController 
    layout 'foo' 
    def bar 
    respond_to do |format| 
     format.html 
     format.js { render :layout => false } 
    end 
    end 
end 

Espero que ayude.

J.K.

Cuestiones relacionadas