miércoles, 17 de enero de 2007

Cómo subir ficheros con ajax_scaffold

Necesitamos tener tres plugins instalados:

- ajax_scaffold generator: para generar las tablas y los formularios.
- acts_as_attachment: para manejo automágico de archivos.
- respond_to_parent: para ejecutar los ficheros rjs desde un iframe en la ventana padre.

Una vez instalados los tres plugins, lo primero es generar el ajax_scaffold que necesitemos

>ruby script/generate ajax_scafold [my_table]

Con ello se genera automáticamente y, entre otras cosas, el controlador, el modelo y las vistas necesarias para el funcionamiento del ajax_scaffold.

En el modelo, añadiremos una línea similar a ésta

acts_as_attachment :storage => :file_system, :file_system_path => "[path_to_my_files]"

en el que indicamos al sistema que este tipo de registros llevan asociado un fichero.

Además es necesario modificar la tabla asociada como indica este link. En general, añadiendo estas cinco filas a la tabla mediante migration es suficiente:

add_column :my_table, :content_type, :string add_column :my_table, :filename, :string add_column :my_table, :size, :integer add_column :my_table, :parent_id, :integer add_column :my_table, :thumbnail, :string

En el partial _new_edit.rhtml hemos de cambiar el formulario para que no ejecute una llamada ajax sino un envío post.

<%= form_tag (
  url_for(@options.merge(:controller => '/[my_controller]')),
    {:id => element_form_id(@options), :target => 'hiddenIframe', :multipart => true } )%>


Además, hay que añadir un iframe oculto que reciba la petición.

<div style="OVERFLOW: hidden; WIDTH: 0px; HEIGHT: 0px"> <iframe id="hiddenIframe" name="hiddenIframe" src="" width="0" height="0"></iframe> <div>

Finalmente, en el controlador es necesario hacer que tras la actualización de datos se ejecute el archivo rjs que corresponda teniendo en cuenta que no se recibe una llamada ajax (xhr?).

responds_to_parent do
render :action => '[my_action].rjs'
end

No hay comentarios: