2010-10-25 9 views
13

No puedo creer que he estado buscando cuatro horas para esta simple tarea, pero lo hice.Rails 3: ¿Actualizaciones simples de la página AJAXy?

En Rails 2.3, podría reemplazar una sección de una página con este código simple:

render: Actualización de hacer | página | page.replace_html "div_id",: parcial => "NEW_CONTENT", ... final

En Rails 3, Ryan Bates me ha escrito completamente nuevas funciones de JavaScript, cambiando de carriles Prototipo (por defecto) para jQuery, y de lo contrario, no disfrutar de la vida. Los otros tutes no son más directos.

¿Qué me estoy perdiendo? ¿Cómo reemplazamos un <div> en estos días?

Respuesta

1

¿Todavía tiene jQuery allí? Se lo recomiendo sobre Prototipo cualquier día ...

Si aún está ahí sólo se puede utilizar lo siguiente en su Javascript:

$.get("<%= url_for path/to/partial %>", 
     function(response) { 
     $("#div_id").html(response); 
     }); 

Esto consigue el parcial a través de AJAX y justo lo vuelca en el div con ID div_id.

Espero que esto ayude!

+0

No, solo estoy tratando de actualizar a Rails 3 por ahora, no quiero aprender jQuery hoy. :-) page.replace_html parecía lo suficientemente simple y efectiva. –

+0

¡Maldición, ah bien! Desafortunadamente, ¡no he usado RJS o Prototype en tanto tiempo que he olvidado cómo usarlos! – robbrit

0

Ni siquiera estoy seguro de que deba realizar una llamada AJAX para cargar ese parcial. Creo que en un archivo js.erb, una llamada a render (: partial => object_or_path) simplemente devolverá una cadena con todo el html, que puede envolver en un objeto jQuery y anexar. Ejemplo:

$('#div_id').html($('<%= render :partial => @object %>')) 
4

Todo el RJS cosas hace que el JavaScript en línea y hace que el dom muy molesta . Además, al evitar javascript en línea, puede abrir otras formas posibles de optimizar su javascript por comprimiendo y almacenando en caché esos archivos en el navegador. Esa es la razón por la cual RJS se está alejando del alcance de los rieles 3. Un poco de movilidad con jQuery o Prototype por un día debería ponerlo en marcha con este tipo de cosas pequeñas y ayudará al proyecto a largo plazo.

12

Gracias, muchachos. La respuesta oficial parece ser que, sí, el equipo se sintió simple, es enemigo del bien y lo hizo más complicado.

La primera clave es crear un archivo .js.erb NOMBRADO para el método LLAMANDO la actualización de AJAX. Entonces, si el método de índice maneja la actualización, coloque el JavaScript sin procesar en index.js.erb. Esto va en la carpeta de vistas.

En segundo lugar, el código que trabajó en index.js.erb era

m = $('list_users');  
m.innerHTML = "<%= escape_javascript(render :partial => "reload_users") %>"; 

Luego de hacer la llamada, añadir en el bloque respond_to del método controlador, añadir:

format.js 

último , llamando a la vista tiene:

<%= link_to "Update User List", @reload_users_path, :remote => true %> 

Por cierto, supuestamente todas las páginas de edad usando page.replace Wil Trabajo si instalas un plugin.La página de descarga del complemento sugiere que se rompió en las últimas versiones de Rails 3 y no se ha corregido. Además, varios bloggers vendrán a tu casa y te cambiarán de abedul si lo usas.

+0

No estoy seguro de por qué algunos desarrolladores de rieles piensan que .replace_html es "inline javascript". Es RPC (llamada a procedimiento remoto) un patrón de diseño sólido. Solo necesitan convertir el servidor en un servicio de mensajería cliente/servidor RPC y hacer que la biblioteca API del lado del cliente sea independiente. – Greg

-2

Prueba esto:

page.call "$('#div_id').html", render(:partial => 'new_content') 
+0

La respuesta no comprende – user1972007

0

Por lo que yo sé, a lo largo de la misma línea que la respuesta anterior, se puede hacer algo como esto en su plantilla:

<%= link_to "Update User List", @reload_users_path, :remote => true %> 

Y en el controlador, Haga lo siguiente:

respond_to do |format| 
    format.js { 
    render :text => "alert('reloaded')" 
    } 
end 

De esta manera se puede tener controlador de "ejecutar" lado del cliente JS muy parecida a como render: UPDA solía hacer Esto es equivalente a hacer lo siguiente en Rails 2:

render :update do |page| 
    page << "alert('reloaded')" 
end 

¿Hay alguna razón por la que este enfoque no sea aconsejable?