2011-03-15 20 views
5

Tengo problemas con rails3 para representar Javascript (si esto es relevante, uso JQuery y funciona bien ya que se usa en muchas otras partes de la aplicación) en lugar de html.Rails Ajax: .js.erb representado como texto, no como JS

Lo que tengo: me miras, tengo este enlace:

<%= link_to 'Edit', edit_user_repreneur_path(@user_repreneur, :format => :js), :remote => true %> 

En primer lugar, yo realmente no entiendo por qué tengo que añadir: format => JS para obtener el controlador para usar la vista JS, y no la HTML. Aquí está el código del controlador:

def edit 
    @user_repreneur = UserRepreneur.find_by_id_view(params[:id]) 
    respond_to do |format| 
     format.js 
     format.html 
    end 
end 

Al comienzo de la clase del controlador, tengo esta línea:

respond_to :js, :html 

Mi archivo edit.js.erb contiene una sola línea con una alerta . Sin embargo, al representar la página, el JS se representa como texto y, por lo tanto, no se ejecuta. He intentado cambiar la línea format.js a

format.js { render :layout => false } 

Pero eso no cambia nada. Supongo que me falta algo, pero realmente no veo qué ...

Muchas gracias de antemano, ¡salud!

PD: No sé si esto es útil, pero antes de agregar el formato: format =>: js bit en mi ayudante de enlace, la vista siempre se representaba como HTML, y si comenzaba la línea format.html , Tuve un error 406 No aceptable en el servidor.

+0

¿Es realmente enviado por una solicitud de AJAX? puede verificar en la consola o en la consola Firebug –

+0

tener respond_to: js,: html al comienzo del controlador significa que está anticipando el uso de responder_con en sus acciones (en lugar de responder_a). Me pregunto si esta redundancia podría estar causando problemas. ¿Ha intentado borrar esa primera línea en el controlador? tampoco debería necesitar agregar: format =>: js a la vista –

+0

En la consola de Chrome, cuando hago clic en el enlace veo una solicitud GET, con un código de respuesta 304 y un tipo de texto/javascript. Además, comentar la línea en el controlador no cambia nada, ¡pero gracias por la información :)! Sé que no debería necesitar especificar el formato en la vista, pero de lo contrario siempre hace que HTML ... extraño. – Elhu

Respuesta

10

No creo que el problema sea con el código del lado del servidor. Todo se ve bien para mí. Y el hecho de que está representando edit.js.erb demuestra que su código del lado del servidor funciona bien.

El problema está en su lado del cliente. Cuando recibe la respuesta de Ajax, no la ejecuta como javascript. Lo está ejecutando como texto.

Recientemente he tenido este problema yo mismo y me gustaría tener mi código pero estoy trabajando. Sin embargo, personalmente escribí la solicitud jQuery Ajax en lugar de confiar en :remote => true ya que esa opción se usa principalmente en formularios.

Intente darle a su link_to una identificación y luego ponga esta jQuery en su application.js o donde sea.

$('#link_id').click(function(){ 
    $.ajax({ 
     type : 'GET', 
     url : '/:controller/:action/', 
     dataType : 'script' 
    }); 
    return false; 
}); 

Esto le agarra el evento de clic en el enlace, enviar una solicitud al servidor que debe devolver su archivo edit.js.erb, y luego ejecutarlo como guión.

Tenga en cuenta que hay muchas cuestiones de seguridad a tener en cuenta, así como tokens de autenticidad y cosas así. Sin embargo, esto debería hacer que tu alerta se ejecute y te lleve por el camino correcto para completar tu aplicación.

Lea en jQuery's Ajax para obtener más opciones y detalles sobre POSTING data también.

Espero que esto ayude.

ACTUALIZACIÓN: Otras posibles soluciones incluyen el uso de UJS como un controlador de Javascript.Puede leer la documentación en https://github.com/rails/jquery-ujs y ver un Railscast sobre el tema Unobtrusive Javascript usando UJS.

+0

Esto funciona, muchas gracias. Sin embargo, realmente no entiendo por qué tengo que usar ese truco ... y por qué: remote => true no parece funcionar correctamente en los enlaces. – Elhu

+0

He estado reflexionando mucho sobre eso. Como dije, estoy mucho más en la codificación manual de todo mi Javascript, pero he encontrado algunos recursos más que seguramente te ayudarán y he actualizado mi respuesta en consecuencia. –

+0

Debería echar un vistazo al problema planteado por tommasop, en los comentarios a mis preguntas. Parece una tontería comprobarlo, pero resolvió mi problema. – Elhu

1

Parece un poco tarde para proporcionar esta respuesta, pero mejor tarde que nunca.

Está mezclando respond_to y respond_with. En la parte superior de la clase de controlador, usa responder_a: js,: html. A continuación, poner esto en su edición acción

def edit 
    @user_repreneur = UserRepreneur.find_by_id_view(params[:id]) 
    respond_with @user _repreneur 
end 
1

archivos js.erb rendir como texto si no tiene los jquery_ujs lib incluido en su archivo application.js:

//= require jquery 
//= require jquery_ujs 

y necesitará los siguientes gemas en su Gemfile :

gem 'jquery-rails' 
gem 'jquery-ui-rails' 
Cuestiones relacionadas