Novedades en Edge Rails #8

Posted: Diciembre 28th, 2008 | Author: Juan Lupión | Filed under: blog | No Comments »
Nota: Este artículo es traducción del publicado el 26 de Diciembre de 2008 por Mike Gunderloy en el blog de Ruby on Rails.

El mayor cambio que se ha producido en Rails aún no está reflejado en el propio código. Hablamos, claro está, de la fusión con Merb en Rails 3. Hay una rama 3-0-unstable en el repositorio pero aún no se ha separado de la rama principal de desarrollo. De momento nos seguiremos centrando en la rama master que verá la luz como Rails 2.3.

Y Rails 2.3 continúa cociéndose. El equipo hizo 39 entregas esta semana, a pesar de que mucha gente se ha ido de vacaciones. Muchas fueron correcciones menores de fallos, pero hay algunas cosas que podrían resultar de interés

Unificación del rendering

ActionController::Base#render ahora es mucho más astuto a la hora de decidir qué mostrar. Basta con echarle cosas y esperar que saque los resultados correctos. Si estamos usando Rails 2.2, por lo general debemos dar información explícita sobre qué es lo que hay que mostrar:

render :file => '/tmp/random_file.erb'
render :template => 'other_controller/action'
render :action => 'show'

Ahora en Rails .3, basta con proporcionar lo que queremos mostrar:

render '/tmp/random_file.erb'
render 'other_controller/action'
render 'show'
render :show

Ahora Rails escogerá entre archivo, plantilla o acción dependiendo de si hay un ‘/’ al principio, un ‘/’ en medio, o ningún ‘/’. También se puede enviar un símbolo cuando queramos mostrar una acción. Otros estilos de invocación (:inline, :text, :update, :nothing, :json, :xml, :js) aun necesitan la opción explícita.

commit commit
commit
commit

Correcciones en ActiveRecord

Un par de correcciones en ActiveRecord para eliminar algunos casos en los que fallaban las asociaciones. Uno se encarga de poner comillas en los nombres de tablas en algunas asociaciones has_many :through si el nombre de la table contenía una palabra clave SQL. commit

La otra corrección permite utilizar un hash en las condiciones de una relación has_many:

has_many :orders, :conditions => {:status => 'confirmed'}

Esto funcionaba en Rails 2.1 pero falla en Rails 2.2 y funcionará otra vez en Rails 2.3 (en Rails 2.2 se puede usar una cadena en lugar de un hash para especificar las condiciones). commit

Se han eliminado algunos efectos colaterales de invocar Model#last (cambiaban el orden de otros finders dentro del mismo ámbito). commit

Prompts for Date Select Helpers

Con este parche, podemos proporcionar rótulos personalizados en los diversos helpers que tratan con fechas (date_select, time_select, y datetime_select) de la misma forma en que se hace con los helpers de selección de colecciones. Se puede pasar una cadena o un hash de cadenas individuales para cada componente. También se puede utilizar un rótulo genérico poniendo :prompt a true:

select_datetime(DateTime.now, :prompt => true)

select_datetime(DateTime.now, :prompt => "Choose date and time")

select_datetime(DateTime.now, :prompt =>
  {:day => 'Choose day', :month => 'Choose month',
   :year => 'Choose year', :hour => 'Choose hour',
   :minute => 'Choose minute'})

commit

Esto y lo otro

El script dbconsole ahora permite usar un password compuesto exclusivamente de números sin fallar. commit

Se pueden usar símbolos en la opción :type de send_file y send_data, por ejemplo: send_file("fabulous.png", :type => :png). commit

Si usamos los delegates de ActiveSupport, hay una nueva opción :allow_nil que permite devolver nil en lugar de levantar una excepción cuando el objeto destino es nil. commit

Se puede especificar una fecha y hora específica para los campos updated_at: cust = Customer.create(:name => "ABC Industries", :updated_at => 1.day.ago) commit


Novedades en Edge Rails #7

Posted: Diciembre 20th, 2008 | Author: Juan Lupión | Filed under: blog | No Comments »
Nota: Este artículo es traducción del publicado el 19 de Diciembre de 2008 por Mike Gunderloy en el blog de Ruby on Rails.

El equipo de Rails no ha estado precisamente hibernando esta semana: diversos desarrolladores han hecho 50 entregas a la rama edge. A continuación enumeramos las que creemos que son las novedades más importantes de la semana.

Rails Metal

Si has estado al tanto de Rails, seguramente habrás leído acerca de Metal esta semana: puntos de acceso super-rápidos dentro de nuestras aplicaciones Rails que se saltan las rutas y Action Controller para proporcionarnos velocidad pura y dura (con el coste de perder todas las bondades de Action Controller, por supuesto) Esto se basa en todo el trabajo efectuado recientemente para hacer que Rails compatible con Rack. En vez de explicar Metal con más detalle, vamos a ver algunos enlaces donde se puede leer más:

Almacenamiento de Sesiones basado en Rack

Un cambio muy importante ha empujado los fundamentos del almacenamiento de sesiones en Action Controller hasta el nivel de Rack, algo que ha llevado bastantes cambios en el código, si bien debería ser totalmente transparente en nuestras aplicaciones Rails (como bola extra, algunos fragmentos del antiguo gestor de sesiones CGI fueron eliminados) Esto también es importante por una razón: ahora las aplicaciones no Rails basadas en Rack que tengamos compatirán los mismos manejadores de almacenamiento de sesión (y por tanto la misma sesión) que nuestras aplicaciones Rails. Además, la sesiones ahora se cargan bajo demanda (en la línea de las mejoras en la carga del resto del framework) commit

Ha habido otro cambio relacionado que proporciona identificadores de sesión persistentes para las sesiones de cookies, con un API compatible para las sesiones alojadas en el servidor. commit

Manejo de tipos MIME

Ha habido un par de cambios en el código qe gestiona los tipos MIME en Rails. En primer lugar MIME::Type ahora implementa el operador =~ lo que hace las cosas mucho más sencillas cuando uno tiene que comprobar la presencia de un tipo que tiene sinónimos operator

if content_type && Mime::JS =~ content_type
  # hacer algo chulo
end

Mime::JS =~ "text/javascript"        => true
Mime::JS =~ "application/javascript" => true

El otro cmbio es que el framework ahora usa code>Mime::JS cuando comprueba en diversos sitios si recibe Javascript , con lo que el manejo de estas alternatias es ahora más limpio. commit commit

Mejoras en Active Record

Aunque Active Record ha sido parte de Rails desde siempre, la gente está aún arrancando mejoras de uso y rendimiento aquí y allí. Esta semana se hicieron entregas para dejar de generar algunas consultas inútiles cuando se trabaja con asociaciones belongs_to (commit), para dar mejores mensajes de errores en llamadas find_by_foo! que no tienen éxito (commit), para arreglar cuestiones de precarga de asociaciones (commit y commit), para mejorar el rendimiento con el adaptador de MySQL (commit).

Esto y lo otro

¿Recuerdan la eliminación de ruido en los archivos de log que se incorporó hace un par de semanas? Pues basado en esto, ahora se ha embellecido la salida de cualquier Gem en los volcados de trazas. commit

Si estamos en edge, Rails ahora nos oblig a tlizar Mocha 0.9.3 o superior para poder ejecutar los tests. commit

Se ha mejorado algo también el manejo de ETag: Rails no enviará la cabecera Etag cuando la respuesta no tiene contenido o cuando se envían archivos con send_file. commit

Y si queremos rastrear quién ha colaborado con Rails en el pasado, ahora es mucho más fácil gracias a la enorme tarea de recolección de datos de Xavier Noria: repasó todos los changelogs y normalizó los nombres de los autores, así que ahora ya no tenemos el embrollo de nombres y direcciones de correo commit


Novedades en Edge Rails #6

Posted: Diciembre 16th, 2008 | Author: Juan Lupión | Filed under: blog | No Comments »
Nota: Este artículo es traducción del publicado el 12 de Diciembre de 2008 por Mike Gunderloy en el blog de Ruby on Rails.

He aquí nuestro repaso semanal de lo que ha ocurrido en el edge de Rails, donde el código es emocionante e incluso a veces estable. Esta semana sólo ha habido 32 commits, posiblemente estamos entrando en una fase de hibernación de final de año.

Mejoras en la gestión de memoria

Se han corregido un par de pérdidas de memoria. Había una que ocurre en Rails 2.2 cuando se configura config.log_level = :warn (este parche también se ha aplicado a la rama 2-2-stable asi como en edge) y otra que ocurría cuando se invoca reset_session en un around_filter (este parche sólo ha ido a Edge y pronto será portado a 2.2). commit commit

Plantillas de Aplicación

Se ha estado haciendo limpieza en la funcionalidad de plantillas de aplicación presentada la semana pasada. Esto incluyó soporte para instalar plugins como submódulos de git, y una tarea de rake para aplicar una plantilla a una aplicación ya existente . Con esta tarea, ahora podemos hacer

rake rails:template LOCATION=~/template.rb

Y los cambios indicados en la plantilla se aplicarán sobre el código ya existente del proyecto.

Ajustes en I18n

La internacionalización tiene acceso ahora a más partes de la infraestructura de Rails, incluyendo conectores de sentencia en Array#to_sentence y separadores en los mensajes de error de validación de Active Record . También resultará de interés a la comunidad internacional de Rails el siguiente parche que añade el método ActiveSupport::Multibyte::Chars#ord para devolver correctamente el valor Unicode del primer carácter de una cadena.

Esto y lo otro

Hay una nueva versión de memcache-client (1.5.0.5) en Rails edge que arregla algunos fallos en la 1.5 original y añade mejor soporte de failover y timeouts. Se puede encontrar más información en el ticket de Lighthouse commit

El método to_xml de ActiveRecord se hace un poco más flexible con la opción :camelize, que convierte todos los nombres de columna en la salida a camelcase. commit

Si testeas muchas vistas que utilizan parciales te alegrará saber que assert_template ahora recibe una opción :partial que puede buscarlos en la salida directamente. commit

Y por último hay un parche que aún no ha sido aplicado a Rails que pero que te podría interesar mirar en Lighthouse. Introduce el soporte del código de status HTTP 418 de forma que Rails cumpla con el RFC2324 . Estamos seguros de que el equipo del core recibirá bien toda discusión sobre este cambios.


Novedades en Edge Rails #5

Posted: Diciembre 8th, 2008 | Author: Juan Lupión | Filed under: blog | Tags: , | No Comments »
Nota: Este artículo es traducción del publicado el 5 de Diciembre de 2005 por Mike Gunderloy en el blog de Ruby on Rails.

El desarrollo de Rails 2.3 sigue avanzando a buen ritmo. Veamos lo que ha ocurrido durante la última semana

Plantillas de aplicación

Rails incorpora ahora rg, el generador de aplicaciones de Jeremy McAnally. Esto significa que ahora tenemos la generación de aplicaciones por plantillas. Si tienes un conjunto de plugins que incluyes en todas las aplicaciones (entre otros muchos casos de uso), puedes simplemente configurar una plantilla una única vez y usarla una y otra vez cuando ejecutas el comando rails. commit

Mejoras en find

Hasta el venerable código que utiliza ActiveRecord para hablar con la base de datos se puede mejorar, y ha habido un par de ellas durante esta semana. En primer lugar, se le ha quitado un AS extra al SQL que se genera para precargar registros en las asociaciones has_and_belongs_to_many, que hace que funcione mejor con algunas bases de datos. También tenemos ahora la opción :having en find, (así como eh has_many y en has_and_belongs_to_many) para filtrar registros en los finds agrupados. Como saben los que tienen una buena base de SQL, esto permite filtrar basándose en los resultados agrupados:

developers =  Developer.find(:all, :group => "salary",
  :having => "sum(salary) =>  10000", :select => "salary")

commit commit

Integración con Rack

Continúa la mejora de la integración de Rails con Rack. Esta semana se vio la muerte del venerable procesador de CGI dentro de Rais, así como el uso de Rack para despachar FCGI. También hubo algo de refactorización en los tests de Rails para que se lleven mejor con Rack. commit commit

Limpieza del archivo de configuración

A lo largo de los años, el fichero environment.rb ha quedado un poco abarrotado con cometarios, documentación varia y configuración que la mayor parte de la gente no necesita. David Heinemeir se tomó unos minutos para limpiar un poco y el estado actual es mucho más ordenado. Como parte de la limpieza, la configuración del almacenamiento de sesiones ha sido movida a su propio fichero commit

Adiós a los scripts de procesos

Si eres uno de los (pocos) desarrolladores de Rails que despliega sus aplicaciones en un entorno que depende los scripts inspector, reaper, y spawner, tienes que saber que estos scripts ya no vienen incluidos con el core de Rails porque son un bagaje innecesario para las aplicaciones modernas que se despliegan con alternativas como Passenger. Pero si te hacen falta, puedes conseguir copias con el plugin irs_process_scripts. commit

Otros

El que Rails compruebe la falsificación de IPs puede ser una molestia en los sites que tienen mucho tráfico de usuarios con teléfonos móviles porque sus proxies por lo general no ponen las cosas bien. Si este es el caso, se puede configurar ActionController::Base.ip_spoofing_check = false para desactivar esta comprobación. commit

Rails.root devuelve ahora un objeto Pathname, lo que quiere decir que puedes usarlo directamente con el método join para limpiar el código que utilice File.join. commit

ActionController::Dispatcher implementa ahora su propio stack de middleware, que puedes ver lanzando rake middleware. commit

La carga de gemas se porta mejor con las dependencias no satisfechas. commit

Ahora auto_link aplica adecuadamente las opciones como :target y :class a los enlaces a direcciones de correo. commit


Filtros y silenciadores en los logs de Rails

Posted: Noviembre 30th, 2008 | Author: Juan Lupión | Filed under: blog | Tags: , | 1 Comment »

Una de las novedades de Rails edge es la inclusión de filtros y silenciadores en las trazas de nuestra aplicación. Los filtros permiten cambiar al vuelo contenidos de las líneas de traza en base a expresiones regulares y los silenciadores, más radicales, se limitan a tragarse las líneas de log que lo activen.

En Rails < = 2.2, si hacemos lo siguiente

   $ rails test-exception
   $ cd test-exception
   $ script/generate scaffold blog
   $ script/server

Y lanzamos un navegador hacia http://localhost:3000/blogs obtendremos una bonita traza de error como esta.

Sin embargo, en las versiones posteriores a Rails 2.2 la traza de error es mucho más escueta y por tanto más fácil de leer porque omite información que por lo general es poco necesaria. He aquí la nueva traza.

Como era de imaginar la cosa no acaba aquí sino que podremos configurar los filtros y silenciadores a nuestro gusto si editamos el fichero config/initializers/backtrace_silencers. Por ejemplo, con el siguiente cambio y con nuestra configuración de Rails

Rails.backtrace_cleaner.add_filter {|line|
    line.sub(/(\/opt\/local\/lib\/ruby\/gems\/1.8\/gems\/)([a-z]+)-([0-9.]+)\/(.*)/) {|match| " #{$2} (#{$3}) :#{$4}"}
}

conseguiremos que las trazas generadas por el código de las gemas aparezca mostrando el nombre de la gema y su versión. Puede verse aquí la traza que se generaría.


Novedades en Edge Rails #4

Posted: Noviembre 29th, 2008 | Author: Juan Lupión | Filed under: Home, blog | Tags: , | No Comments »

La semana pasada los desarrolladores norteamericanos celebraron el Día de Acción de Gracias, pero esto no se ha notado en el desarrollo de Rails. Las cosas se encaminan hacia la versión 2.3 de Rails.

Integración con Rack

La base de script/server se ha reescrito y simplificado. Por ejemplo, la lista explícita de servidores soportados ha desaparecido y en su lugar Rails ahora depende de la instalación de Rack, y script/server hace esto – lo que quiere decir que ahora Rails soportará cualquier servidor siempre que Rack lo haga también.

Rutas más eficientes

Las rutas han visto un par de cambios importantes esta semana. Los helpers de rutas que empiezan por formatted_ han desaparecido, y en su lugar ahora hay que pasar la opción :format al helper normal. De esta maanera se ahorra hasta el 50% de las rutas generadas para un recurso y esto puede ahorar una cantidad sustancial de memoria (hasta el 100MB en aplicaciones grandes según este ticket en Lighthouse) Si tu código utiliza los helpers formatted_ por el momento seguirá funcionando, pero debes tener en cuenta que estos helpers son «a extinguir» y que tu aplicación será más eficiente si adaptas tu código para usar el nuevo estándar. Otro cambio importante es que Rails ahora soporte múltiples archivos de rutas, en lugar de usar únicamente routes.rb Se puede usar RouteSet#add_configuration_file para incorporar más rutas en cualquier momentot – y sin borrar las rutas ya cargadas. commit commit

Mejor soporte de plugins de Engines

El segundo cambio en las rutas permite soportar mejor los Engines: ahora se cargan y recargan automáticamente los archivos de rutas de los Engines (como en el resto de plugins) Pero los Engines están recibiendo más atención, además del enrutado: si tu plugin tiene un directorio app, entonces los directorios app/[models|controllers|helpers] se añadirán automáticamente al load path de Rails. Hay una discusión en curso acerca de cómo debería funcionar este mecanismo y cuánto reutilizar del plugin de Engines actual así que es posible que aún no hayamos visto los últimos commits en este aspecto. Los Engines ahora soportan la adición de paths para las vistas.commit commit commit commit

Volcados de los tests más sensatos

Si usamos el plugin Quiet Backtrace de Thoughtbot, que nos permite eliminar selectivamente las líneas de los volcados generados por Test::Unit, nos agradará saber que han aparecido ActiveSupport::BacktraceCleaner y Rails::BacktraceCleaner en el core de Rails. Se soportan tanto filtros (para hacer sustituciones en las líneas de volcado usando expresiones regulares) como silenciadores (para eliminar líneas enteras). En las aplicaciones nuevas Rails añadirá automáticamente silenciadores para eliminar la mayor parte del ruido en los volcados de tests y construirá un archivo config/backtrace_silencers.rb donde poder configurar los nuestros. commit

Integración con Ruby 1.9

Varios commits continúan avanzando en la compatibilidad con Ruby 1.9 y minitest para asegurar que Rails 2.3 está listo para funcionar con las nuevas mejoras en Ruby cuando sean lanzadas. Los que sigan el edge, sin embargo, deben tener en cuenta que uno de los últimos cambios en edge Rails depende de un parche al core de Ruby que aún no ha sido aplicado. También será necesario aplicar (temporalmente) el fork de Mocha de Jeremy Kemper para ser compatibles con MiniTest tal y como requiere este parche .

Tiempo de arranque más rápido en desarrollo

Jeremy Kemper y Josh Peek han estado trabajando para garantizar que haya partes de Rails y sus dependencias se carguen en memoria sólo cuando sea realmente necesario. Comprobad los commits del 23 de Noviembre para ver muchos cambios relacionados con esta recarga perezosa. Los frameworks Active Support, Active Record, Action Controller, Action Mailer y Action View ahora utilizan autoload para cargar sus clases individuales, y así mantener la carga de memoria lo más baja posible mejorando el rendimiento de Rails. commit commit commit commit commit

Otros

Con la nueva opción preload_frameworks se puede especificar si queremos que las librerías del core se autocarguen en el arranque. Por defecto es false de forma que Rails se autocarga pieza por pieza, pero en algunas circunstancias podríamos querer traerlo todo a la vez – por ejemplo Passenger y JRuby necesitan que Rails se cargue en su totalidad. commit

Los asset hosts son más flexibles, con las poisiblidad de declarar un host como un objeto específico que responde a cierta llamada. DHH ha proporcionado un proyecto de ejemplo, asset-hosting-with-minimum-ssl, que demuestra un buen uso de esta funcionalidad. commit

La ubicación de la carpeta de helpers es ahora configurable en una aplicación Rails ajustando ActionController::Base.helpers_dir, lo cual será una bendición para algunas circunstancias poco habituales – el caso de uso original es la construcción de una aplicación Rails que facilita la extensión mediante plugins en lugar de mediante la alteración de la propia aplicación. commit

La generación de tokens de protección contra CSRF se ha simplificado, y ahora Rails utiliza una cadena aleatoria generada por ActiveSupport::SecureRandom en lugar de trastear con los IDs de sesión. Como resultado de esto las opciones :digest y :secret de protect_from_forgery están obsoletas y no surtirán ningún efecto a partir de ahora. commit

Y ya que hablamos de secretos, seguro que algunos encontrarán algún uso original y útil de ActiveSupport::MessageEncryptor, que proporciona una forma sencillo de cifrar información para su almacenamiento en lugares no seguros (como las cookies). commit

La función de Active Support from_xml ya no depende de XmlSimple. En su lugar, Rails ahora incluye un su propia implementación de XmlMini con sólo la funcionalidad necesaria, de forma que Rails puede dejar de incluir la copia de XmlSimple que venía arrastrando. commit commit

Como se recordará, las mejoras de la semana pasada incluyeron el cambio de nombre de application.rb a application_controller.rb. Esta semana hay una nueva tarea de Rake, rake rails:update:application_controller que hace esto automáticamente y que forma parte de la tarea rake rails:update. commit

Hay buenas noticias si usamos ActiveSupport::OrderedHash: por fin implementa each_key y each_value. commit

Se ha internacionalidado un poquito más del core de Rails: las unidades usadas por number_to_human_size. Si mantienes un archivo de traducciones, ahora tienes que añadir las traducciones de las unidades de almacenamiento: bytes, KB, MB, GB, TB. commit

Por fin ha desaparecido el soporte de los componentes en Rails, que fueron en su momento según «Agile Web Development wih Rails» un brillante ejemplo de lo que ocurre cuando la ambición se impone a la prudencia. Por si un par de años de advertencia sobre lo que iba a ocurrir no fue suficiente, ahora es el momento de encontrar una solución alternativa. commit

Han dejado de generarse por defecto un par de archivos en /public que tenían que ver con los dispatchers de CGI y FCGI. De todas formas, si te hace falta, puedes obtenerlos añadiendo la opción --with-dispatches al ejecutar el comando rails, o bien generarlos después usando rake rails:generate_dispatchers). commit commit


Novedades en Edge Rails #3

Posted: Noviembre 21st, 2008 | Author: Juan Lupión | Filed under: blog | No Comments »

Antes que nada esta semana, una advertencia para aquellos que no sigan de cerca el estado del repositorio de Rails – “edge” ahora significa el filo de la navaja. Ya se está preparando el lanzamiento de la release 2.2 y el repositorio se ha bifurcado; por el momento la versión edge de Rails se identifica como 2.3 , aunque el número de versión podría cambiar más adelante. Si queremos instalar la versión 2.2 en nuestra máquina, deberíamos asegurarnos de que estamos usando la rama 2-2-stable, y no edge, que está sufriendo cambios profundos.

El código en 2-2-stable aún sigue viendo cambios, pero son pequeños ajustes. Esta semana, se trata de corregir un bug en la asignación en asociaciones has_one :through , más ajustes a la protección CSRF , y una correción a la manipulación de checkboxes para valores booleanos, así como la actualización de las copias incluidas de TZInfo, Prototype, script.aculo.us. También se ha avanzado en la compatibilidad con Ruby 1.9 (aunque el objetivo de soportar Ruby 1.9 en sus totatlidad está planteado para Rails 2.3).

Las mayores modificaciones en la rama 2.2 es la adición de soporte explícito de internacionalización en los proyectos Rails recién generados, incluyendo un archivo de locale de ejemplo, la autocarga de todos los locales que existan en config/locales y configuración de ejemplo en config/environment.rb. commit

También es destacable que en 2.2 se ha eliminado un buen trozo de código, desapareciendo de los casos de tests de ActiveRecorod todo un embrollo de casos especiales para el adaptador de SQL Server. Ken Collins ha hecho un tremendo trabajo consiguiendo que el adaptador de SQL Server funcione de la manera que Rails espera que lo hagan los adaptadores, lo cual es un gran pasado en el área de la portabilidad de los adaptadores. commit

En cuanto a la rama edge, ahí tenemos todavía más acción dado que en esta rama recién abierta acaba de entrar un montón de código que estaba esperando su momento. Corren tiempos interesantes y merece mucho la pena descargarse edge. Pasemos a ver algunos de los cambios más notables de la última semana.

Muchos cambios son obras de Jeremy Kemper, que ha estado mejorando los tests internos de Rails para cambiar de Test::Unit::TestCase a ActiveSupport::TestCase. Esto incluye también el requisito de usar Mocha para testar Rails (en el código 2.2, si no tenemos Mocha instalados, algunos tests serán ignorados), así como hacer que la estrategia de testing en Rails (tanto en el core como en las aplicaciones generadas) sea más consistente de ahora en adelante.

Aquellos a los que molestaba el caso especial del nombre de archivo application.rb se alegrarán de saber que se ha cambiado a application_controller.rb. Hay más información aquí y aquí . commit

Con Rails 2.3 se introducirá la noción del default scopes : similares a los named scopes, pero que se aplican a todos los scopes o métodos find dentro de la clase. Por ejemplo, podemos escribir default_scope :order => 'name ASC' y en culauqie rmomento en que se accedan a registro de esa clase, serán recuperados ordenados por nombre (a no ser, claro está, que se indique otra opción) commit

Muchos programadores han adoptado la noción de usar try() a la hora de lanzar operaciones en objetos – he aquí el post en el blog de Chris Wanstrath que lo presenta. Esto es especialmente útil en vistas donde uno puede evitar los chequeos de nil escribiendo código como< %= @person.try(:name) %>. Pues bien, ahora está incluido dentro de Rails. commit

También en el terreno del azúcar sintáctico aparece Enumerable#none? para comprobar que ningno de los elementos cumplen con el bloque proporcionado. commit

El método render se ha ido haciendo más listo conforme pasan los años, y lo será aún más en la 2.3. Si tenemos un objeto o una colección y los nombres conciden, ahora podemos hacer tan sólo < % render @article %> o < % render @articles %> y todo funcionará. Ryan Daigle ha escrito algunos ejemples de esto. commit

En el mismo orden de cosas, en 2.3 render_component ha pasado de “a extinguir” a “inexistente”. Si es necesario, aún podemos instalar el plugin . commit

El helper autolink se ha refactorizado para hacerlo un poco menos complicado y más intuitivo. commit commit

Ha habido un arreglo para una fuga de memoria relacionada con el soporte de multithreading y los tags de assets, que podría perjudicar a sites que estuvieran referenciando muchas imágenes externas. Aaron Batalion ha contribuido la solución a este problema, así como un blog explicando el problema. commit and commit

Por último, merece la pena mencionar que ha surgido algo de controversia alrededor de un cambio hecho al código 2.2 hace cinco meses – la adición de Array#second a Array#tenth como aliases de Array#[1] a Array#[9]. Sin tomar partido en la controversia, notaremos que el cambio más reciente en edge ha reducido el soporte sólo de Array#second a Array#fifth – y con el ahorro ahora se ha podido implementar Array#forty-two. commit


Novedades en Edge Rails #2

Posted: Noviembre 16th, 2008 | Author: Juan Lupión | Filed under: blog | Tags: , | No Comments »

Lo más importante esta semana en el desarrollo de Rails es el inminente lanzamiento de Rails 2.2.1 -también conocido como Rails 2.2 RC2. Debido a eso ha habido algunos cambios significativos en el repositorio de Rails.

En primer lugar, es probable que sea necesario actualizar rubygems para ejecutar RC2: ahora requiere la versión 1.3.1 de rubygems, que fue publicada exactamente ayer. Esto hará más util y estable la posibilidad de poner gemas en el directorio vendor, aunque a costa de una actualización que puede resultar algo costosa. En este artículo se pueden encontrar algunas soluciones. commit

También se ha trabajado bastante en el motor de rutas durante la semana pasada. Jeremy Kemper entregó bastantes correcciones que minimizan la creación de objetos y expresiones regulares, recortando así el uso de memoria. commit commit Ahora tenemos las las opciones :only y :except para invocar a map.resources, que también harán descender el uso de memoria si usamos muchas rutas de recursos -véanse estos artículos para entrar en detalle (aunque también ha habido algunos retoques a la manera en que funcionan los recursos anidados después de que se publicase). commit commit commit

El nuevo código de pooling de conexiones de ActiveRecord ha sido afinado un poco también, evitando algunos problemillas con el adaptador de Oracle y siendo un poco más eficiente en modo desarrollo. commit

Las URLs polimórficas son ahora más intuitivas si uno de sus parámetros es nil. Por ejemplo, llamar a polymorphic_path([@project, @filter, @issue]) con un filtro nulo ahora devuelve project_issue_url en lugar de NoMethodError. commit

Se ha limitado la funcionalidad de protección contra request forgery de forma que sólo se aplica a peticiones que solicitan contenido formateado en HTML. Ha habido una gran discusión en el ticket de Lighthouse que llevó a este cambio, pero se resume en que la implementación anterior tenía fallos que hacían que las acciones destroy fueran inaccesibles cuando se usaba XML. Además, los otros tipos de peticionese pueden proteger por otros medios. commit


Novedades en Edge Rails

Posted: Noviembre 8th, 2008 | Author: Juan Lupión | Filed under: Home, blog | No Comments »

(Esta entrada a es traducción de This week in edge Rails, por Mark Gunderloy)

Para aquellos que no tengais tiempo de seguir todos los commits al código de Rails, hemos resucitado esta
sección del blog. Esta vez vamos a cubrir tres semanas de commits, el tiempo desde el lanzamiento de
Rails 2.2 RC1
(también conocido como Rails 2.2) Aunque no se han añadido nuevas funcionalidades importantes a Rails, esto no
quiere decir que el repositorio haya estado muerto: ha habido unos 75 commits en este lapso de tres semanas.

En el arreón final hasta Rails 2.2 hemos podido ver una gran cantidad de pequeñas correcciones conforme los
desarrolladores van comprobando la calidad de la release

  • Se corrigió un error de corrupción de datos binarios que aparecerió en el adaptador de PostreSQL (commit)
  • La expresión regular detrás de redirect_to ahora acepta una variedad más amplia de esquemas
    de URL, lo que permite redirigir a destinos que antes no era posible (commit)
  • Se localizó una regresión en date_select y datetime_select que podría, en algunas
    circunstancias, lanzar una excepción de puntero nulo (commit)
  • El helper sanitize se ha corregido para evitar escapar entidades HTML que antes hubieran
    sido previamente escapadas (commit)
  • FormTagHelper ha dejado de generar HTML no válido si el nombre contiene corchetes (commit)
  • Se machacó una pérdida de memoria en el método scoped_methods de ActiveRecord (commit)

Algunas de las funcionalidades más importantes de la versión 2.2 han recibido también ajustes. Se ha
trabajado en atar algunos cabos sueltos en el apartado del threading y cambios para que el
backend de i18n recargue sus traducciones en modo de desarrollo. La librería Prototype se actualizó a
la última versión (1.6.0.3). El código para configuar, cargar y poner en vendor las gemas también
ha tenido algo de atención, así como el código que mantiene pools de conexiones a la base de datos.

Y aunque la rama esté congelada, esto no quiere decir que no se sigan colando nuevas funcionalidades:

  • El método current_page es más fiable ahora, en el sentido de que ignora las opciones que no
    se le pasen explícitamente (haciéndolo más amigo de las URLs que utilizan la cadena de la petición para
    paginar y cosas así) (commit)
  • Se ha hecho limpieza en el sistema de logado para que poer defecto sea menos parlanchín: se verán menos
    mensajes duplicados en los logs de Rails (commit)
  • El método render ahora acepta la nueva opción :js para permitir enviar Javascript sin tener
    que utilizar RJS (commit)
  • En las versiones recientes de Ruby (1.8.7 o superiores), ActionMailer activará STARTTLS si el servidor lo
    soporta; de forma que ActionMailer sea compatible con GMail si necesitar plugins (commit)

Viviendo al filo (o qué hay de nuevo en edge Rails) #3

Posted: Julio 6th, 2008 | Author: Juan Lupión | Filed under: Home | Tags: , | No Comments »

No ha habido mucha actividad, en términos de grandes cambios o nuevas funcionalidades en el core de Rails. Así que lo mejor es dirigirse a los logs
de los commits
en busca de cambios menores o correcciones. Ha habido algunos avances en la refactorización y sorporte de threads en ActionPack, así como alguna actividad en ActiveModel, pero nada realmente concreto.

Soporte de thin en script/server

script/server ahora comprueba si Thin está instalado y lo utiliza. Esto es bastante cómodo si usamos Thin como nuestro servidor en producción y queremos usarlo también en desarrollo. Hay que añadir config.gem ‘thin’ al fichero environment.rb.

Este parche ha sido contribuido por uno de los chicos de fluxin, y estos son los cambios

Personalización de String#humanize mediante reglas de inflexión

La extensión String#humanize del core se utiliza para convertir cadenas con guiones bajos, por ejemplo nombres de tablas, en texto legible. Por ejemplo:

 "Actor salary"
"anime_id".humanize
=> "Anime"

Pero a veces esto no funciona tan bien, cuando tenemos tablas heredadas de otra aplicación o simplemente con nombres inhumanos como “act_sal_money” (que sería humanizada como “Act Sal Money”)

Ahora podemos especificar nuestras propias reglas de inflexión (igual que puede hacerse para personalizar las reglas de inflexión para plurales, singulares, etc.)

Inflector.inflections do |inflect|
  inflect.human /_cnt$/, '\1_count'
  inflect.human 'act_sal_money', 'Actor Salary'
end

Obsérvese que podemos usar expresiones regulares para convertir por ejemplo columnas como “click_cnt” en “Click Count”

Demos las gracias a Dan Manges y Pascal Ehlert por este cambio.

Condiciones sobre múltiples tablas utilizando hashes

Pratik ha entregado un pequeño (pero útil) cambio en ActiveRecord que permite especificar las condiciones de una tabla sobre la que se efectúa un JOIN en su propio hash. Por ejemplo:

Anime.all(
  :joins => :character,
  :conditions => {
    :active => true,
    :characters => { :gender => 'female' }
  }
)

La sentencia anterior encontrará todos los animes “activos” con personajes femeninos. Cambios