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

jueves, 11 de enero de 2007

La consola. Cómo escribir caracteres no ASCII

Esto es un cambio radical en la calidad de vida de cualquier programador de Rails en Windows. Abrir la consola y ejecutar each o cualquier otra sentencia con bloques de código es 'escriptacular'. Para ello hay que editar el fichero $RUBY_HOME/bin/irb.bat. Hemos de buscar el tag :WinNT y comprobar que la línea siguiente tiene esta pinta: "%~d0%~p0ruby" -x "%~f0" %* -r irb/completion --noreadline E voilá¡