2012-01-26 18 views
8

Estoy actualizando una aplicación de rieles anterior a 3.1. La aplicación funciona bastante bien, pero tengo algunas funciones ajax que necesito actualizar. (Si hace alguna diferencia, estoy usando jquery y coffeescript)Actualización de rieles a 3.1 - cambio del manejo de ajax de "render: update" para responder a

Toda la funcionalidad ajax existente se ha escrito usando render: updates. por ejemplo,

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

Creo que la nueva forma preferida de hacerlo es utilizar un responder_a? bloquear para manejar el js, pero no estoy seguro de la mejor manera de manejar estos casos diferentes.

Para el primer caso (el page.remove) Creo que con la línea de tubería de activos, debería tener un js externo en/app/assets/javascripts/para manejar el lado de Javascript (por ejemplo, la página.remove) pero estoy no estoy seguro de cómo pasar los parámetros al archivo js. Supongo que puede hacer algo como:

respond_to do |format| 
    format.js {:render :js => {:ftof => params[:ftof_id]} 
end 

pero no estoy seguro de cómo se puede recoger esto desde dentro del archivo js. ¿Es esta la forma correcta de pasar información a la js? ¿O hay otro método que debería usar?

Para el segundo caso (el page.replace_html) creo que esto ha sido obsoleto/eliminado de 3.1 (según apidock). Sospecho que esto debería estar usando el archivo js en el directorio app/assets/javascript, pero no estoy seguro de cómo debo hacer la representación parcial y pasar esta información al js.

gracias por cualquier punteros en esta área =)

Respuesta

31

Uso jQuery conjuntamente con js.erb puntos de vista y respond_to bloques.

Lo que esta acción es (Diremos FoosController#update por el bien de ejemplo):

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

se convertiría en:

respond_to do |format| 
    format.html 
    format.js  # <- this is what we're after 
end 

con un archivo de vista update.js.erb:

$('#financial_tran_offset_<%= params[:ftof_id] %>').remove(); 
$('#details').replaceWith('<%= escape_javascript(render(:partial => 'details', :locals => {:obj => @fire})) %>'); 

update.js.erb será analizado por ERb, representado como JS, enviado de vuelta al cliente t vía Ajax y evaluado.

Puede pasar lo que desee a estas plantillas JS. Después de todo, son archivos ERb. Use <%= %> y las variables de instancia como lo haría con las vistas HTML/ERb. Si llama al render en sus vistas JS/ERb, envuélvalo con escape_javascript para obtener HTML para que se visualice correctamente.


render :update llamadas métodos antiguos JavaScriptGenerator de ayuda para prototipo. La conversión a jQuery es bastante simple ya que ambos hacen lo mismo: seleccionar un elemento DOM y manipularlo.

Aquí hay una pequeña y agradable tabla de traducción con manipulaciones típicas.Retire métodos auxiliares del prototipo del controlador, y el lugar de su contraparte o jQuery JS en una vista JS/ERb correspondiente:

 Prototype       jQuery/Javascript 
    in controller     in JS/ERb view (xxxxxx.js.erb) 
     ---------       ----------------- 
page.alert "message"     alert('message'); 
page.hide "id"      $('#id').hide(); 
page.insert_html \ 
     :top, "id", "content" $('#id').prepend('content'); 
     :bottom, "id", "content" $('#id').append('content'); 
     :before, "id", "content" $('#id').before('content'); 
     :after, "id", "content" $('#id').after('content'); 
page.redirect_to "url"    window.location.href = 'url'; 
page.reload       window.location.reload(); 
page.remove "id"      $('#id').remove(); 
page.replace "id", "content"   $('#id').replaceWith('content'); 
page.replace_html "id", "content" $('#id').html('content'); 
page.show "id"      $('#id').show(); 
page.toggle "id"      $('#id').toggle(); 

No se olvide de sus puntos y comas en todos y cada línea!

+0

genial. ¿Hay alguna forma de hacerlo con coffeescript, o está limitado a js solo en el archivo update.js.erb? –

+0

Si realmente desea utilizar CoffeeScript, es posible que pueda, pero el soporte en vistas dinámicas es irregular por lo que puedo decir. (Personalmente prefiero JS.) CoffeeScript para jQuery one-liners es un poco exagerado. '$ ('# id'). append ('content');' to '$ ('# id'). Agregar 'contenido'. No vale la pena la sobrecarga para guardar un conjunto de paréntesis. JQuery es lo suficientemente compacto y simple. Bien podría seguir con eso. – Substantial

+0

¡Gracias por la respuesta detallada! –

Cuestiones relacionadas