Un poco tarde, pero el 15 de marzo del corriente mes Rails 2.3 fue liberado
Aca les dejo el changelog en ingles de los cambios:
Rails 2.3 relased notes
Y aca les explico algunas caracteristicas en español:
Se dejo de usar la vieja arquitectura de CGI con la que funcionaba rails (y por la cual muchos implementaban fastcgi), y ahora usa Rack
Se renovo el soporte de rails engine, lo cual significa que ahora es mas facil extender nuestra aplicacion con otras aplicaciones embebidas, es decir, al meterle plugins se pueden hacer mas cosas que antes por ahi se dificultaban un poco
Se organizo la documentación y se separo en varios sitios, como Rails Guide y la wiki. A su vez se esta actualizando la documentacion generada con rdoc en el git y se esta escribiendo un libro de rails para la comunidad.
Rails se esta preparando para migrar a ruby 1.9.1, lo cual va a ofrecer soporte nativo para i18n, hoy en dia el soporte para i18n se ofrece con algunos parches de rails a la libreria de ruby, pero cuando se migre a la 1.9.1 el soporte va a ser nativo.
Nuevas caracteristicas para ActiveRecord (ActiveRecord dejo de ser lo que era en sus primeras versiones, deberian de chsumear el soporte que tiene para relaciones polimorfologicas y demas….), entre las cosas nuevas podemos encontrar:
Nested Attributes!!! Si leen el libro advanced rails recipes, van a ver una parte que explica como manejar formularios que manejan al mismo tiempo varios modelos de datos, y si bien se podia hacer tranquilamente, el codigo no era tan expresivo y natural como debiera de ser en rails, en cambio con nested attributes ahora es mas sencillo de hacer y mas lindo:
Nest Model Forms
PD: Proximamente van a ver en mi blog un articulo sobre como usar nested attributes
Nested Transactions, son transacciones adentro de otras transacciones, y que fallen las transacciones de adentro, no significa que tengan que fallar las de afuera, mejor explicado con codigo
User.transaction do
User.create(:username => 'Admin')
User.transaction(:requires_new => true) do
User.create(:username => 'Regular')
raise ActiveRecord::Rollback
end
end
User.find(:all) # => Returns only Admin
Dynamic Scope, ya conocian por ejemplo los dynamic finders, como User.find_by_name(‘Rodrigo’), bueno, ahora con dynamic scope pueden aplicar filtros
Order.scoped_by_customer_id(12)
Order.scoped_by_customer_id(12).find(:all, :conditions => "status = 'open'")
Order.scoped_by_customer_id(12).scoped_by_status("open")
Default scopes, cuando trabajan con un modelo de datos, por ejemplo orders, pueden especificar algun default scope, por ejemplo:
class Order < ActiveRecord::Base
default_scope
rder => 'created_at desc'
end
Order.find(:all) # "SELECT * FROM orders ORDER BY created_at desc"
Batch Processing, cuando trabajan con grandes cantidades de objetos del modelo de datos, por ejemplo, suponganse que estan en ciclo de facturacion y tienen que facturarle a 10000 clientes, ahora ActiveRecord soporta BatchProcessing, es decir, pueden trabajar de manera natural como si estubiesen trabajando con todos esos objetos al mismo tiempo, pero en vez de procesar todos los objetos al mismo tiempo y comerse la memoria, la libreria procesa de 1000 objetos a la vez (aunque udstedes pueden elegir cuantos objetos procesar al mismo tiempo)
Condiciones multiples para callbacks, ahora pueden user :if y :unless por ejemplo en un callback al mismo tiempo, algo asi
class Order < ActiveRecord::Base
before_save :check_customer_credit, if => :active, unless => [:admin, :tester]
end
Finders with Having para grupos, puden utilizar el having condition cuando hacen busquedas por grupos, por ejemplo:
developers = Developer.find(:all, :group => "salary", :having => "sum(salary) > 10000", :select => "salary")
En cuanto a Action Controller:
Renderings mas inteligentes, antes:
render :file => '/tmp/random_file.erb'
render :template => 'other_controller/action'
render :action => 'show'
Ahora:
render '/tmp/random_file.erb'
render 'other_controller/action'
render 'show'
render :show
HTTP Digest Authentication Support (el nombre habla por si mismo)
Routing mas eficiente
Optimizacion del respond_to
respond_to es usuado masivamente, ya que con ese comando se puede facilmente implementar REST, ahora despues de los cambios, esta funcion es un 8% mas rapido que antes
Se mejoro el cache
Soporte natural para localized views
Ahora, dependiendo del locale que setean en la aplicacion, pueden tener varias vistas, si una vista dibuja app/views/orders/show.html.erb, si setean el locae a :es, ahora va a dibujar app/views/orders/show.es.html.erb
Action View
Nested Object Forms, como mencione mas arriba, ahora mezclar varios objetos distintos en un mismo formulario es mucho mas natural
Rendering de partes mas inteligente
# Equivalent of render :partial => 'articles/_article',
#
bject => @article
render @article
# Equivalent of render :partial => 'articles/_article',
# :collection => @articles
render @articles
Rails Metal!!!!
Practicamente, te deja ejecutar acciones sin el peso del MVC ofrecido por rails, esto sirve para ejecutar acciones que tienen que ser super rapidas y ejecutadas en milesimas de segundos, lo cual va a ser una optimizacion muy grande para muchos sitios existentes
Rails metal
A mi entender estos fueron los cambios más importantes
Asegurense de checkear los screencasts en rails cast: App Templates in rails 2.3, Rails Engines, Rails Metal, Rack Middleware y Rails 2.3 Extras