El código de la plantilla Rails js.erb no se activa cuando renderizo un parcial dentro de él, ¿por qué sucede esto?

Tengo una aplicación que permite a los usuarios publicar micropublicaciones y cuando se publica una micropublicación, uso ajax y jquery para actualizar la publicación en la página sin que se actualice la página.

Hasta hace unos días esto funcionaba bien, pero de repente funciona de forma aleatoria, algunas veces no funciona y otras veces sí. El micropost se publica y la base de datos se actualiza, pero la plantilla js que renderizo no parece ser disparada la mayor parte del tiempo.

Controlador de micromensajes crear acción:

def create
     @micropost = current_user.microposts.build(params[:micropost])

        respond_to do |format|
            if @micropost.save
            format.js   { render :post_on_wall }
            end
        end

end

Plantilla JS Post_on_wall:

$('form#new_micropost').off().on('ajax:success', function(e){
  alert('working');

    e.preventDefault();

    var micropostsContainer = $(this).parent('div.microposts');


    micropostsContainer.find('div.postsContainer').prepend('<%= j render("users/partials/micropost") %>');
    micropostsContainer.find('div.postHolder:first').hide().slideDown(250);
    micropostsContainer.find('textarea#micropostBox')
        .removeClass("micropost_content_expanded")
        .addClass("micropost_content")
        .val("");
    micropostsContainer.find('div#micropostOptions').addClass('micropostExtraOptions');
    micropostsContainer.find('div#postOptions').hide();
    micropostsContainer.find('div.imagePreview').css({
                                                  marginBottom:'0px',
                                                  marginTop:'0px'
                                                  })
                            .children().remove();

});

Aquí se pone extraño. Si elimino todo el código dentro de la plantilla js, excepto la alerta, se dispara. Con todo el código puesto de nuevo, la alerta no se dispara. Ahora, si elimino el código erb que hace que el micropost sea parcial y agrego algo de texto en una cadena, se activa la alerta de plantilla js y la página se actualiza con el texto.

No tengo idea de por qué sucede esto. Incluso volví a una versión de mi aplicación de hace unos días y tengo el mismo problema. Lo único que he cambiado sería la versión de raíles. Actualicé de 3.2.0 a 3.2.3.

De cualquier manera, teniendo en cuenta que los micromensajes todavía se están publicando en la base de datos, ¿alguna idea de por qué tengo este problema con JS Ajax? De hecho, estoy cerca de eliminar el uso de remote_to en mis formularios y solo usar JQuery $ .ajax en su lugar, pero no debería tener que hacerlo. Me gusta aprovechar lo que ofrece Rails.

Aquí está mi seguimiento de pila:

Started POST "/microposts" for 127.0.0.1 at 2012-05-21 11:41:31 +0100
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1] Processing by MicropostsController#create as JS
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Parameters: {"utf8"=>"✓", "authenticity_token"=>"4KVkocVy4ONTrhQ7DqBWsJXcZC8uYDOjmv6C1DlcRxg=", "micropost"=>{"photo_attributes"=>{"photo_album_id"=>"25"}, "user_id"=>"2", "content"=>"lkkllk", "link"=>""}, "commit"=>"Post"}
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]    (0.1ms)  BEGIN
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   SQL (0.3ms)  INSERT INTO `microposts` (`content`, `created_at`, `image`, `link`, `poster_id`, `updated_at`, `user_id`) VALUES ('lkkllk', '2012-05-21 10:41:31', NULL, '', NULL, '2012-05-21 10:41:31', 2)
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]    (0.3ms)  COMMIT
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Micropost Load (0.7ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Profile Load (0.3ms)  SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`user_id` = 2 LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Photo Load (0.2ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 3 LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Photo Load (0.3ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`micropost_id` = 4892 LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]    (0.2ms)  SELECT COUNT(*) FROM `comments` WHERE `comments`.`micropost_id` = 4892
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT COUNT(*) FROM `comments` WHERE `comments`.`micropost_id` = 4892
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Photo Load (1.9ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 3 LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   CACHE (0.0ms)  SELECT `microposts`.* FROM `microposts` WHERE `microposts`.`user_id` = 2 ORDER BY microposts.created_at DESC LIMIT 1
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Rendered users/partials/_micropost.html.erb (19.3ms)
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1]   Rendered microposts/post_on_wall.js.erb (20.8ms)
[afb16a524c6d01fd7408e9944dbf30f9] [127.0.0.1] Completed 200 OK in 33ms (Views: 20.0ms | ActiveRecord: 4.5ms | Sphinx: 0.0ms)

Agradecería mucho alguna idea de lo que podría estar pasando para poder solucionarlo.

saludos cordiales

preguntado el 21 de mayo de 12 a las 11:05

¿No debería usar representación parcial en su código? Solo una suposición. -

¿En mi código? No estoy seguro de lo que quieres decir. -

En la plantilla js <%= j render(:partial => ..) %>. No estoy seguro, pero también puede representar todo el diseño. -

1 Respuestas

Rails no sabe qué variable de instancia representar. Pase @micropost en :locals hash o simplemente 'renderice @micropost'.

Vea este Railscast muy útil para un gran modelo: http://railscasts.com/episodes/136-jquery

contestado el 21 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.