2012-08-02 12 views
8

Desde JavaScript, llamaré a un controlador a través de AJAX, así:Rieles: Representación de un js.erb través de una llamada AJAX

$.ajax({ 
    type: 'GET', 
    url: '/books' 
} 

En mi controlador que tengo:

def index 
    render 'lightbox.js.erb' 
end 

En mi rutas tengo:

resources :books do 
    member do 
    get :lightbox 
    end 
end 

En lighbox.js.erb que tengo:

alert("Hello world!"); 

Por alguna razón, la alerta nunca se llama. No recibo ningún mensaje de error, ni a través del servidor ni a través de Firebug. Estoy perdido por lo que podría estar yendo mal. ¿Algunas ideas?

Respuesta

20

Resulta que en el lado del cliente, mi JavaScript estaba siendo presentado como texto. Confirmé esto mirando el feed de la consola. Decía:

Started GET "/books/lightbox?book=4&username=tbaron&_=1344009191129" for 127.0.0.1 at 2012-08-03 10:53:11 -0500 
Processing by BooksController#lightbox as text 

Esas dos últimas palabras deberían haber leído "como JS". Después de rooting alrededor, encontré este blog post que condujo a una solución sorprendentemente simple. Agregue "dataType: script" a la llamada AJAX:

$.ajax({ 
    type: 'GET', 
    url: '/books' 
    dataType : 'script' 
} 

¡Gracias por su ayuda, a todos!

7

creo que es porque hay que llamar books.js:

$.ajax({ 
    type: 'GET', 
    url: '/books.js', 
    success: function(data) { 
    eval(data); 
    } 
} 

En acción index:

def index 
    respond_to do |format| 
    format.js { render 'lightbox'} 
    end 
end 

Y lightbox.js.erb debe estar en app/views/libros

Si todavía doesn No funciona, intente llamar al books/index.js También puede usar firebug/chrome para verificar qué responde el servidor a su ajax llamada

+1

Todavía no hubo suerte. Además, Firebug muestra que el servidor está respondiendo. Incluso puse una devolución de llamada exitosa en AJAX, y está disparando. – nullnullnull

+0

¿Cuál es la respuesta que está recibiendo? – muffinista

+0

Recibo mi código como respuesta. Me pregunto por qué no está desencadenando? – nullnullnull

1

Puede probar esta secuencia de comandos para llamar a su acción en java script

var post_params = {}; 
var action = '/books/script_action'; 

$.post(action, post_params).success(function (data) { 

    eval(data); 

}).error(function (data) { 

    alert("Erro to call a action controller"); 

}); 

Y en el controlador de probar esto. Sugiero crear una nueva acción

def script_action 
    render 'lightbox.js' 
end 

En el archivo de rutas:

match "books/script_action/" => "books#script_action" 
0

Trate de añadir esto al controlador:

respond_to :js 
0

En su acción index, dejar sin diseño:

def index 
    respond_to do |format| 
    format.js { render 'lightbox', layout: false} 
end 

este es un trabajo para mí.

0

Para cualquier persona que se tropiece con esto y simplemente quiere llamar a una acción del controlador que responde con un archivo js.erb, lo he logrado de esta manera (con la ayuda de Anthony Alberto's Awesome Answer).

Action Controller

def some_action 
    .. 
    respond_to do |format| 
    format.js { render 'some_action' } 
    end 
end 

some_action.js.erb

... 
$('#someActionWrap').html('<%= j render "some/displaypartials/action_partial" %>') 
... 

Ajax llamada

var id = '<%= @someresource.id %>'; 
$.get('/someresource/' + id + '/action/', null, function(data){ 
    eval(data) 
}, 'script'); 
0

i hav e un problema similar en link_to helper, pero esto se corrigió usando remote:true

Cuestiones relacionadas