2012-03-16 15 views
6

estoy usando Rails 3.1.1No se puede enlazar ajax: el éxito de forma creada con form_for ....: distancia => true

Tengo el siguiente en una vista haml:

= form_for booking.notes.build, :remote => true do |f| 
    = f.text_area(:content) 
    = f.hidden_field(:noteable_id) 
    = f.hidden_field(:noteable_type) 
    = f.submit('Add note') 

que crea nuevas notas en el envío. Además, la respuesta de mi controlador aparece correctamente en una consola de Chrome (pestaña Red). Pero parece que no puedo entender la respuesta.

Quiero actualizar la lista de notas en la página después del envío. He intentado vincularme con la respuesta del ajax para poder captar la respuesta, pero estoy fallando. Por ejemplo, creo que esto debería funcionar, pero no:

$('#new_note').bind('ajax:success', function() { 
    alert('Hi'); 
}); 

Pero no se activa ninguna alerta. Lo cual creo que explica por qué esto tampoco funciona.

$('#new_note').bind("ajax:success", function(evt, data, status, xhr){ 
    // Insert response partial into page below the form. 
    $(this).parent.append(xhr.responseText); 

}) 

¿Puede indicarme qué podría estar yendo mal?

+0

Tengo alrededor de esto mediante el uso de un create.js.erb con código que actualiza el objeto necesario. Pero prefiero poder tomar la llamada ajax, para poder usar el objeto de error ajax si es necesario. – ReggieB

Respuesta

0

Esto generalmente se hace haciendo un archivo create.js.erb en la sección de vista de su controlador (si no lo ha hecho ya) en el que tiene acceso a las variables que salgan de la acción create, y allí puede renderizar su html

en su archivo create.js.erb se podría escribir algo así como

$("#new_note").html('<%= escape_javascript(render partial: "path/to/partial") %>'); 

leer más en this post que escribí hace algún tiempo, se explica prácticamente todo el flujo

+4

Es discutible que esto se "hace generalmente". Personalmente, considero que es una mala práctica que hace que su código sea menos sostenible. JS debe ir a su carpeta de activos donde pertenece. – egze

+0

esto no tiene nada que ver con los activos, es la forma en que los controladores de Javascript se manejan por defecto en Rails –

+0

Todo lo que digo es que solo porque puede devolver javascript desde el controlador no significa que sea la mejor solución. La materia de gusto supongo y no me gusta este enfoque. – egze

8

¿Has probado 'ajax: completar'?

Otras cosas que pueden salir mal aquí:

código de estado no era realmente "éxito". Esto desencadena el éxito en jQuery

if (status >= 200 && status < 300 || status === 304) { 

O se evaluó el controlador de eventos antes de que se muestra el formulario. Trate de delegación de eventos: (. Cuidado, esta es la nueva sintaxis de jQuery Si se utiliza jQuery edad, ajustar en consecuencia)

$("body").on('ajax:success', '#new_note', function(){...}) 

+0

A partir de jQuery 1.8, el método .ajaxSuccess() solo debe adjuntarse al documento. – Ziggy

+1

Esto no es ajaxSuccess(). Rails todavía activa el evento 'ajax: success' en el elemento con data-remote = 'true'. – egze

+0

Esto es eso de "UJS", ¿verdad? ¡Lo siento! Tu respuesta es buena. – Ziggy

1

si lo desea, puede poner su javascript en create.js.erb (código de en este archivo se ejecutará después de la respuesta vendrá a su navegador) Y en este archivo se puede utilizar si la declaración, como

<% if @ok %> 
    //your code 
<% end %> 

si en la acción de su controlador establecido en false @ok la respuesta estará vacía!

Cuestiones relacionadas