2011-05-27 7 views
10

Repaso el Tutorial de Rails de Michael Hartl y presiono un pequeño inconveniente en §12.2.5 donde se supone que debemos crear un botón de trabajo con Ajax. Sé que el código es correcto (terminé copiándolo directamente del libro y volviéndolo a escribir tres veces) y estoy verde. ¡Pero en realidad no funciona!El botón no se actualiza en Ajax - Rails Tutorial 3 en §12.2.5

A través de esta parte del tutorial estamos cambiando un botón de envío de formulario regular para trabajar con Ajax para que la página no se "actualice" (realmente, redirija a la misma página) y solo el botón y una correspondiente actualización del artículo de la barra lateral. El problema es que el botón no se recarga automáticamente al hacer clic como lo espero. Se vuelve a cargar al actualizar una página. Si deshabilito JS en mi navegador, revierte, como debería, a la versión HTML que desencadena una redirección y "actualiza" toda la página. Si te estás preguntando, intenté actualizar la página y probé Firefox, Safari, Chrome y Chrome en incógnito. Apagué y reinicié el servidor de rieles, spork y autotest. Y reescribí todo el código y luego copié todo el código del libro. Todavía perplejo.

Entonces, aunque la prueba es de color verde, tengo una función que no funciona correctamente. Tal vez hay algo que me falta y puedes ayudarme a encontrarlo? Tal vez me falta una joya relacionados javascreipt-, una joya Ajax ...

partes pertinentes del Código:

relationships_controller.erb:

class RelationshipsController < ApplicationController 
    before_filter :authenticate 

    def create 
@user = User.find(params[:relationship][:followed_id]) 
current_user.follow!(@user) 
respond_to do |format| 
    format.html { redirect_to @user } 
    format.js 
end 

final

def destroy 
@user = Relationship.find(params[:id]).followed 
current_user.unfollow!(@user) 
respond_to do |format| 
    format.html { redirect_to @user } 
    format.js 
end 
end 
end 

_follow.html.erb:

<% = form_for (current_user.relationships. compilación (: seguido_id => @ usuario.id), : remoto => verdadero) do | f | %> <% = f.hidden_field: followed_id%>
<% = f.submit "seguir" %> extremo <%%>

_unfollow.html.erb:

<%= form_for(current_user.relationships.find_by_followed_id(@user), 
     :html => { :method => :delete }, 
     :remote => true) do |f| %> 

<% end%>

create.js.erb

$("follow_form").update("<%= escape_javascript(render('users/unfollow')) %>") 
$("followers").update('<%= "#{@user.followers.count} followers" %>') 

destroy.js.erb

$("follow_form").update("<%= escape_javascript(render('users/follow')) %>") 
$("followers").update('<%= "#{@user.followers.count} followers" %>') 

También se aseguró de que esta línea está incluida en el application.html.erb

<%= javascript_include_tag :defaults %> 

Si hay algo más que necesita para evaluar la situación , por favor pregunta y responderé con una actualización.

TIA

Respuesta

0

He estado golpeando mi cabeza contra el mismo problema. Todavía no tengo una solución, pero pensé que podría mover el balón hacia adelante con algo de lo que he intentado.

La ventaja más probable es esta. Al tratar de simplificar las cosas, he tratado de eliminar el código jQuery en sí mismo. Para hacer esto, he usado la consola Inspect Element/scripts de Safari para probar los scripts en la página.

yo decidimos ir con la inocua

$('title').text("Create") 

poner esta es la consola Safari cambia el título. Sin embargo, ponerlo en mis archivos create.js.erb y destroy.js.erb no funciona (cuando hago clic en el botón Seguir/Dejar de seguir). Mis registros muestran que se está llamando a la vista correspondiente de relaciones/destroy.js.erb, pero el elemento no se actualiza (y la página no se vuelve a cargar).

Rendered layouts/_stylesheets.haml (3.3ms) 
Rendered layouts/_header.haml (6.1ms) 
Rendered layouts/_footer.haml (3.8ms) 
Rendered relationships/destroy.js.erb within layouts/application (34.8ms) 
Completed 200 OK in 132ms (Views: 39.0ms | ActiveRecord: 1.3ms) 

Es lo último para cargar. Mi control de relaciones es el mismo que el anterior. Mis formularios son los mismos que en el libro (pero en haml) y he reemplazado el haml con el que está publicado en la rama hartl's github haml.

Por lo tanto, mi suposición es que los archivos create.js.erb y destory.js.erb se están cargando pero no se han ejecutado por algún motivo. ¿Alguien tiene alguna idea de qué hacer después de diagnosticar/resolver esto?

Gracias,

de Dave

+0

utilizar una herramienta como Firebug (con firefox) o las herramientas de desarrollador que vienen con Chrome para obtener una mejor visión de lo que está sucediendo. Por ejemplo, si usa chrome en un golpe de mac command-option-i para abrir las herramientas de desarrollador. haga clic en la pestaña 'consola' y luego intente hacer clic en lo que active su ajax. si hay errores js, los verá aquí. en el pasado, descubrí que mis solicitudes de ajax no se formateaban correctamente, lo que causaba que js arrojara errores. Estaba buscando problemas en los rieles, pero el problema estaba en la respuesta del Ajax y el navegador estaba atrapándolo, no en los rieles (por lo que no aparecía en mis registros) – Dty

+0

Humbledaisy, ¿fue capaz de resolverlo? Tengo el mismo problema aquí: el resultado devuelto por Rails (que confirmé usando un sniffer http) no desencadena el cambio, pero si pega el código en el depurador, funciona. Estoy confundido. – chesterbr

1

Estoy usando Rails 3.1.1 y tenía el mismo problema siguiendo los rieles 3.0 tutorial. En la actualización de la versión, Rails se alejó de Prototype y comenzó a usar jQuery. Para corregir la versión anterior del javascript tuve que actualizar create/destroy.js.erb.

Puede leer sobre esto en chapter 13. Todo se reduce a agregar un "#" al frente de su ID de etiqueta y reemplazar la llamada ".update" con ".html".

6

¿Qué versión de rieles estás usando? Si su 3.1 tiene que cambiar

create.js.erb a:

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>") 
$("#followers").html('<%= "#{@user.followers.count} followers" %>') 

y destroy.js.erb a:

$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>") 
$("#followers").html('<%= "#{@user.followers.count} followers" %>') 

(Nótese el extra #) está en la último capítulo del tutorial, las notas de cambiar a los carriles 3.1

0

Ive ha tenido este problema recientemente con Rails 4

ejecutar el servidor web, haga clic en el seguimiento/Dejar de seguir a continuación, volver a sus registros del servidor web

buscar el error

que había un error de render ID NIL

porque había actualizado la variable @user en relations_controller.erb para el final del código, pero no en la primera línea en la que he definido

def crear user = User.find (params [: followed_id]) current_user.follow (usuario) respond_to hacer | formato | format.html {redirect_to @user} format.js finales extremo

fijado con

def crear @ user = User.find (params [: followed_id]) current_user.follow (@user) responder_ a hacer | formato | format.html {} @user redirect_to format.js finales final

mismo para destruir - por lo que actualizar todas las instancias de usuario con @user

aplausos

Cuestiones relacionadas