Para instalar Rails 3:
# Usa sudo si tu configuración lo requiere
$ gem install rails
1 Actualización a Rails 3
Si estás actualizando una aplicación existente, es una gran idea tener una buena cobertura de pruebas antes de comenzar. También debes actualizar primero a Rails 2.3.5 y asegurarte de que tu aplicación siga funcionando como se espera antes de intentar actualizar a Rails 3. Luego, ten en cuenta los siguientes cambios:
1.1 Rails 3 requiere al menos Ruby 1.8.7
Rails 3.0 requiere Ruby 1.8.7 o superior. El soporte para todas las versiones anteriores de Ruby se ha eliminado oficialmente y debes actualizar lo antes posible. Rails 3.0 también es compatible con Ruby 1.9.2.
CONSEJO: Ten en cuenta que Ruby 1.8.7 p248 y p249 tienen errores de serialización que hacen que Rails 3.0 se bloquee. Ruby Enterprise Edition los ha solucionado desde la versión 1.8.7-2010.02. En cuanto a la versión 1.9, Ruby 1.9.1 no es utilizable porque se bloquea por completo en Rails 3.0, así que si quieres usar Rails 3 con 1.9.x, utiliza 1.9.2 para un funcionamiento sin problemas.
1.2 Objeto de aplicación de Rails
Como parte del trabajo previo para admitir la ejecución de múltiples aplicaciones de Rails en el mismo proceso, Rails 3 introduce el concepto de un objeto de aplicación. Un objeto de aplicación contiene todas las configuraciones específicas de la aplicación y es muy similar en naturaleza a config/environment.rb
de las versiones anteriores de Rails.
Cada aplicación de Rails ahora debe tener un objeto de aplicación correspondiente. El objeto de aplicación se define en config/application.rb
. Si estás actualizando una aplicación existente a Rails 3, debes agregar este archivo y mover las configuraciones correspondientes de config/environment.rb
a config/application.rb
.
1.3 script/* reemplazado por script/rails
El nuevo script/rails
reemplaza todos los scripts que solían estar en el directorio script
. Sin embargo, no ejecutas script/rails
directamente, el comando rails
detecta que se está invocando en la raíz de una aplicación de Rails y ejecuta el script por ti. El uso previsto es:
$ rails console # en lugar de script/console
$ rails g scaffold post title:string # en lugar de script/generate scaffold post title:string
Ejecuta rails --help
para ver una lista de todas las opciones.
1.4 Dependencias y config.gem
El método config.gem
ha desaparecido y ha sido reemplazado por el uso de bundler
y un Gemfile
, consulta Vendoring Gems a continuación.
1.5 Proceso de actualización
Para ayudar con el proceso de actualización, se ha creado un complemento llamado Rails Upgrade para automatizar parte de él.
Simplemente instala el complemento y luego ejecuta rake rails:upgrade:check
para verificar tu aplicación en busca de piezas que necesiten ser actualizadas (con enlaces a información sobre cómo actualizarlas). También ofrece una tarea para generar un Gemfile
basado en tus llamadas actuales a config.gem
y una tarea para generar un nuevo archivo de rutas a partir del actual. Para obtener el complemento, simplemente ejecuta lo siguiente:
bash
$ ruby script/plugin install git://github.com/rails/rails_upgrade.git
Puedes ver un ejemplo de cómo funciona en Rails Upgrade es ahora un Plugin Oficial
Además de la herramienta Rails Upgrade, si necesitas más ayuda, hay personas en IRC y rubyonrails-talk que probablemente estén haciendo lo mismo, posiblemente enfrentando los mismos problemas. ¡Asegúrate de compartir tus propias experiencias al actualizar para que otros puedan beneficiarse de tu conocimiento!
2 Creando una aplicación Rails 3.0
# Debes tener instalado el RubyGem 'rails'
$ rails new myapp
$ cd myapp
2.1 Vendiendo Gems
Rails ahora utiliza un Gemfile
en la raíz de la aplicación para determinar las gemas que necesitas para que tu aplicación se inicie. Este Gemfile
es procesado por Bundler, que luego instala todas tus dependencias. Incluso puede instalar todas las dependencias localmente en tu aplicación para que no dependa de las gemas del sistema.
Más información: - Página principal de Bundler
2.2 Viviendo al Límite
Bundler
y Gemfile
hacen que congelar tu aplicación Rails sea pan comido con el nuevo comando bundle
, por lo que rake freeze
ya no es relevante y se ha eliminado.
Si quieres agrupar directamente desde el repositorio Git, puedes pasar la bandera --edge
:
$ rails new myapp --edge
Si tienes una copia local del repositorio de Rails y quieres generar una aplicación usando eso, puedes pasar la bandera --dev
:
$ ruby /path/to/rails/bin/rails new myapp --dev
3 Cambios arquitectónicos en Rails
Hay seis cambios importantes en la arquitectura de Rails.
3.1 Railties restringido
Railties se actualizó para proporcionar una API de plugin consistente para todo el framework de Rails, así como una reescritura total de los generadores y las conexiones de Rails. El resultado es que los desarrolladores ahora pueden conectarse a cualquier etapa importante de los generadores y el framework de la aplicación de manera consistente y definida.
3.2 Todos los componentes principales de Rails están desacoplados
Con la fusión de Merb y Rails, uno de los grandes trabajos fue eliminar el acoplamiento estrecho entre los componentes principales de Rails. Esto se ha logrado y todos los componentes principales de Rails ahora utilizan la misma API que puedes usar para desarrollar plugins. Esto significa que cualquier plugin que hagas, o cualquier reemplazo de componente principal (como DataMapper o Sequel) puede acceder a toda la funcionalidad a la que los componentes principales de Rails tienen acceso y extender y mejorar a voluntad.
Más información: - La Gran Desconexión
3.3 Abstracción de Active Model
Parte del desacoplamiento de los componentes principales fue extraer todos los vínculos a Active Record de Action Pack. Esto se ha completado ahora. Todos los nuevos plugins ORM ahora solo necesitan implementar las interfaces de Active Model para funcionar sin problemas con Action Pack.
Más información: - Haz que cualquier objeto Ruby se sienta como ActiveRecord
3.4 Abstracción de controlador
Otra gran parte del desacoplamiento de los componentes principales fue crear una superclase base separada de las nociones de HTTP para manejar la representación de vistas, etc. Esta creación de AbstractController
permitió simplificar en gran medida ActionController
y ActionMailer
con código común eliminado de todas estas bibliotecas y colocado en Abstract Controller.
Más información: - Arquitectura de Rails Edge
3.5 Integración de Arel
Arel (o Active Relation) se ha adoptado como base de Active Record y ahora es necesario para Rails. Arel proporciona una abstracción de SQL que simplifica Active Record y proporciona los fundamentos para la funcionalidad de relación en Active Record.
Más información: - Por qué escribí Arel
3.6 Extracción de correo
Action Mailer desde sus inicios ha tenido parches, pre-analizadores e incluso agentes de entrega y recepción, además de tener TMail vendido en el árbol de origen. La versión 3 cambia eso con toda la funcionalidad relacionada con el mensaje de correo electrónico abstraída a la gema Mail. Esto reduce nuevamente la duplicación de código y ayuda a crear límites definidos entre Action Mailer y el analizador de correo electrónico.
Más información: - Nueva API de Action Mailer en Rails 3
4 Documentación
La documentación en el árbol de Rails se está actualizando con todos los cambios de API, además, las Rails Edge Guides se están actualizando una por una para reflejar los cambios en Rails 3.0. Sin embargo, las guías en guides.rubyonrails.org seguirán conteniendo solo la versión estable de Rails (en este momento, la versión 2.3.5, hasta que se lance la versión 3.0).
Más información: - Proyectos de documentación de Rails
5 Internacionalización
Se ha realizado una gran cantidad de trabajo con el soporte de I18n en Rails 3, incluyendo la última gema I18n que proporciona muchas mejoras de velocidad.
- I18n para cualquier objeto: el comportamiento de I18n se puede agregar a cualquier objeto incluyendo
ActiveModel::Translation
yActiveModel::Validations
. También hay un fallbackerrors.messages
para las traducciones. - Los atributos pueden tener traducciones predeterminadas.
- Las etiquetas de envío de formularios automáticamente obtienen el estado correcto (Crear o Actualizar) dependiendo del estado del objeto, y así obtienen la traducción correcta.
- Las etiquetas con I18n ahora también funcionan simplemente pasando el nombre del atributo.
Más información: - Cambios de I18n en Rails 3
6 Railties
Con la separación de los principales frameworks de Rails, Railties ha sufrido una gran revisión para facilitar y extender la vinculación de frameworks, motores o complementos:
- Cada aplicación ahora tiene su propio espacio de nombres, la aplicación se inicia con
YourAppName.boot
, por ejemplo, lo que facilita la interacción con otras aplicaciones. - Todo lo que se encuentra en
Rails.root/app
ahora se agrega al path de carga, por lo que puedes crearapp/observers/user_observer.rb
y Rails lo cargará sin ninguna modificación. - Rails 3.0 ahora proporciona un objeto
Rails.config
, que es un repositorio central de todo tipo de opciones de configuración de Rails.
La generación de aplicaciones ha recibido banderas adicionales que te permiten omitir la instalación de test-unit, Active Record, Prototype y Git. También se ha agregado una nueva bandera --dev
que configura la aplicación con el Gemfile
apuntando a tu checkout de Rails (que se determina por la ruta al binario rails
). Consulta rails --help
para obtener más información.
Los generadores de Railties han recibido una gran cantidad de atención en Rails 3.0, básicamente:
- Los generadores se reescribieron por completo y no son compatibles con versiones anteriores.
- La API de plantillas de Rails y la API de generadores se fusionaron (son lo mismo que antes).
- Los generadores ya no se cargan desde rutas especiales, simplemente se encuentran en el path de carga de Ruby, por lo que llamar a
rails generate foo
buscarágenerators/foo_generator
. - Los nuevos generadores proporcionan hooks, por lo que cualquier motor de plantillas, ORM o framework de pruebas puede engancharse fácilmente.
- Los nuevos generadores te permiten anular las plantillas colocando una copia en
Rails.root/lib/templates
. - También se proporciona
Rails::Generators::TestCase
para que puedas crear tus propios generadores y probarlos.
Además, las vistas generadas por los generadores de Railties han tenido algunas mejoras:
- Las vistas ahora usan etiquetas
div
en lugar de etiquetasp
. - Los andamios generados ahora utilizan parciales
_form
, en lugar de código duplicado en las vistas de edición y nuevas. - Los formularios de andamios ahora utilizan
f.submit
, que devuelve "Crear ModelName" o "Actualizar ModelName" dependiendo del estado del objeto pasado.
Finalmente, se agregaron algunas mejoras a las tareas de rake:
- Se agregó
rake db:forward
, que te permite avanzar tus migraciones individualmente o en grupos. - Se agregó
rake routes CONTROLLER=x
, que te permite ver solo las rutas de un controlador.
Railties ahora deprecia:
RAILS_ROOT
en favor deRails.root
,RAILS_ENV
en favor deRails.env
, yRAILS_DEFAULT_LOGGER
en favor deRails.logger
.
PLUGIN/rails/tasks
y PLUGIN/tasks
ya no se cargan, todas las tareas ahora deben estar en PLUGIN/lib/tasks
.
Más información:
7 Action Pack
Ha habido cambios significativos internos y externos en Action Pack.
7.1 Controlador Abstracto
El Controlador Abstracto extrae las partes genéricas de Action Controller en un módulo reutilizable que cualquier biblioteca puede usar para renderizar plantillas, renderizar parciales, ayudantes, traducciones, registro, cualquier parte del ciclo de solicitud-respuesta. Esta abstracción permitió que ActionMailer::Base
ahora solo herede de AbstractController
y envuelva la DSL de Rails en la gema Mail.
También brindó la oportunidad de limpiar Action Controller, abstrayendo lo que se pudo para simplificar el código.
Sin embargo, hay que tener en cuenta que el Controlador Abstracto no es una API orientada al usuario, no te encontrarás con él en el uso diario de Rails.
Más información: - Arquitectura de Rails Edge
7.2 Action Controller
application_controller.rb
ahora tieneprotect_from_forgery
activado de forma predeterminada.- El
cookie_verifier_secret
ha sido deprecado y ahora se asigna a través deRails.application.config.cookie_secret
y se ha movido a su propio archivo:config/initializers/cookie_verification_secret.rb
. - La configuración de
session_store
enActionController::Base.session
ahora se ha movido aRails.application.config.session_store
. Las configuraciones predeterminadas se establecen enconfig/initializers/session_store.rb
. cookies.secure
te permite establecer valores encriptados en las cookies concookie.secure[:key] => value
.cookies.permanent
te permite establecer valores permanentes en el hash de cookiescookie.permanent[:key] => value
que generan excepciones en valores firmados si hay fallos de verificación.- Ahora puedes pasar
:notice => 'Este es un mensaje flash'
o:alert => 'Algo salió mal'
a la llamadaformat
dentro de un bloquerespond_to
. El hashflash[]
sigue funcionando como antes. - Se ha agregado el método
respond_with
a tus controladores, lo que simplifica los venerables bloquesformat
. Se ha agregado
ActionController::Responder
, lo que te permite flexibilidad en cómo se generan tus respuestas. Deprecaciones:filter_parameter_logging
está obsoleto a favor deconfig.filter_parameters << :password
.
Más información:
7.3 Action Dispatch
Action Dispatch es nuevo en Rails 3.0 y proporciona una nueva implementación más limpia para el enrutamiento.
- Gran limpieza y reescritura del enrutador, el enrutador de Rails ahora es
rack_mount
con un DSL de Rails encima, es una pieza de software independiente. Las rutas definidas por cada aplicación ahora están en el espacio de nombres de su módulo de aplicación, es decir:
# En lugar de: ActionController::Routing::Routes.draw do |map| map.resources :posts end # Haces: AppName::Application.routes do resources :posts end
Se agregó el método
match
al enrutador, también puedes pasar cualquier aplicación Rack a la ruta coincidente.Se agregó el método
constraints
al enrutador, lo que te permite proteger las rutas con restricciones definidas.Se agregó el método
scope
al enrutador, lo que te permite crear espacios de nombres para rutas en diferentes idiomas o acciones diferentes, por ejemplo:scope 'es' do resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto' end # Te da la acción de edición con /es/proyecto/1/cambiar
Se agregó el método
root
al enrutador como un atajo paramatch '/', :to => path
.Puedes pasar segmentos opcionales a la coincidencia, por ejemplo
match "/:controller(/:action(/:id))(.:format)"
, cada segmento entre paréntesis es opcional.Las rutas se pueden expresar mediante bloques, por ejemplo puedes llamar a
controller :home { match '/:action' }
.
NOTA. Los comandos de estilo antiguo map
todavía funcionan como antes con una capa de compatibilidad hacia atrás, sin embargo, esto se eliminará en la versión 3.1.
Deprecaciones
- La ruta de captura para aplicaciones no REST (
/:controller/:action/:id
) ahora está comentada. - Las rutas
:path_prefix
ya no existen y:name_prefix
ahora agrega automáticamente "_" al final del valor dado.
Más información: * El enrutador de Rails 3: Rack it Up * Rutas renovadas en Rails 3 * Acciones genéricas en Rails 3
7.4 Action View
7.4.1 JavaScript no intrusivo
Se realizó una importante reescritura en los ayudantes de Action View, implementando ganchos de JavaScript no intrusivos (UJS) y eliminando los antiguos comandos AJAX en línea. Esto permite que Rails use cualquier controlador UJS compatible para implementar los ganchos UJS en los ayudantes.
Esto significa que todos los ayudantes anteriores remote_<method>
se han eliminado del núcleo de Rails y se han colocado en Prototype Legacy Helper. Para obtener ganchos UJS en tu HTML, ahora pasas :remote => true
en su lugar. Por ejemplo:
form_for @post, :remote => true
Produce:
<form action="http://host.com" id="create-post" method="post" data-remote="true">
7.4.2 Ayudantes con bloques
Los ayudantes como form_for
o div_for
que insertan contenido desde un bloque ahora usan <%=
:
<%= form_for @post do |f| %>
...
<% end %>
Se espera que tus propios ayudantes de ese tipo devuelvan una cadena, en lugar de agregar al búfer de salida manualmente.
Los ayudantes que hacen algo diferente, como cache
o content_for
, no se ven afectados por este cambio, todavía necesitan <%
como antes.
7.4.3 Otros cambios
- Ya no es necesario llamar a
h(string)
para escapar la salida HTML, ahora está activado de forma predeterminada en todas las plantillas de vista. Si quieres la cadena sin escapar, llama araw(string)
. - Los ayudantes ahora generan HTML5 de forma predeterminada.
- El ayudante de etiqueta de formulario ahora obtiene los valores de I18n con un solo valor, por lo que
f.label :name
obtendrá la traducción de:name
. - La etiqueta de selección de I18n ahora debería ser :en.helpers.select en lugar de :en.support.select.
- Ya no es necesario colocar un signo menos al final de una interpolación de Ruby dentro de una plantilla ERB para eliminar el retorno de carro final en la salida HTML.
- Se agregó el ayudante
grouped_collection_select
a Action View. - Se agregó
content_for?
que te permite verificar la existencia de contenido en una vista antes de renderizar. - pasar
:value => nil
a los ayudantes de formulario establecerá el atributovalue
del campo en nil en lugar de usar el valor predeterminado - pasar
:id => nil
a los ayudantes de formulario hará que esos campos se rendericen sin el atributoid
- pasar
:alt => nil
aimage_tag
hará que la etiquetaimg
se renderice sin el atributoalt
8 Active Model
Active Model es nuevo en Rails 3.0. Proporciona una capa de abstracción para que las bibliotecas ORM interactúen con Rails mediante la implementación de una interfaz de Active Model.
8.1 Abstracción ORM e Interfaz Action Pack
Parte de la desvinculación de los componentes principales fue extraer todos los vínculos con Active Record de Action Pack. Esto ya se ha completado. Todos los nuevos complementos ORM ahora solo necesitan implementar interfaces de Active Model para funcionar perfectamente con Action Pack.
Más información: - Haz que cualquier objeto Ruby se sienta como ActiveRecord
8.2 Validaciones
Las validaciones se han movido de Active Record a Active Model, proporcionando una interfaz para validaciones que funciona en todas las bibliotecas ORM en Rails 3.
- Ahora hay un método abreviado
validates :atributo, options_hash
que te permite pasar opciones para todos los métodos de clase de validación, puedes pasar más de una opción a un método de validación. - El método
validates
tiene las siguientes opciones::acceptance => Booleano
.:confirmation => Booleano
.:exclusion => { :in => Enumerable }
.:inclusion => { :in => Enumerable }
.:format => { :with => Expresión regular, :on => :create }
.:length => { :maximum => Fixnum }
.:numericality => Booleano
.:presence => Booleano
.:uniqueness => Booleano
.
NOTA: Todos los métodos de validación de estilo de Rails versión 2.3 aún son compatibles en Rails 3.0, el nuevo método validates está diseñado como una ayuda adicional en las validaciones de tu modelo, no como un reemplazo de la API existente.
También puedes pasar un objeto validador, que luego puedes reutilizar entre objetos que usan Active Model:
class TitleValidator < ActiveModel::EachValidator
Titles = ['Sr.', 'Sra.', 'Dr.']
def validate_each(record, attribute, value)
unless Titles.include?(value)
record.errors[attribute] << 'debe ser un título válido'
end
end
end
class Person
include ActiveModel::Validations
attr_accessor :title
validates :title, :presence => true, :title => true
end
# O para Active Record
class Person < ActiveRecord::Base
validates :title, :presence => true, :title => true
end
También hay soporte para la introspección:
User.validators
User.validators_on(:login)
Más información:
9 Active Record
Active Record recibió mucha atención en Rails 3.0, incluyendo la abstracción en Active Model, una actualización completa de la interfaz de consulta utilizando Arel, actualizaciones de validación y muchas mejoras y correcciones. Toda la API de Rails 2.x se podrá utilizar a través de una capa de compatibilidad que se mantendrá hasta la versión 3.1.
9.1 Interfaz de consulta
Active Record, a través del uso de Arel, ahora devuelve relaciones en sus métodos principales. La API existente en Rails 2.3.x aún es compatible y no se deprecia hasta Rails 3.1 y no se elimina hasta Rails 3.2, sin embargo, la nueva API proporciona los siguientes nuevos métodos que devuelven relaciones que se pueden encadenar:
where
- proporciona condiciones en la relación, lo que se devuelve.select
- elige qué atributos de los modelos deseas que se devuelvan de la base de datos.group
- agrupa la relación en el atributo suministrado.having
- proporciona una expresión que limita las relaciones de grupo (restricción GROUP BY).joins
- une la relación a otra tabla.clause
- proporciona una expresión que limita las relaciones de unión (restricción JOIN).includes
- incluye otras relaciones precargadas.order
- ordena la relación según la expresión suministrada.limit
- limita la relación al número de registros especificado.lock
- bloquea los registros devueltos de la tabla.readonly
- devuelve una copia de solo lectura de los datos.from
- proporciona una forma de seleccionar relaciones de más de una tabla.scope
- (anteriormentenamed_scope
) devuelve relaciones y se pueden encadenar con los demás métodos de relación.with_scope
- ywith_exclusive_scope
ahora también devuelven relaciones y se pueden encadenar.default_scope
- también funciona con relaciones.
Más información:
9.2 Mejoras
- Se agregó
:destroyed?
a los objetos de Active Record. - Se agregó
:inverse_of
a las asociaciones de Active Record, lo que te permite obtener la instancia de una asociación ya cargada sin consultar la base de datos.
9.3 Parches y deprecaciones
Además, se realizaron muchas correcciones en la rama de Active Record:
- Se eliminó el soporte de SQLite 2 a favor de SQLite 3.
- Soporte de MySQL para el orden de columnas.
- Se corrigió el soporte de
TIME ZONE
del adaptador de PostgreSQL para que ya no inserte valores incorrectos. - Soporte para múltiples esquemas en nombres de tablas para PostgreSQL.
- Soporte de PostgreSQL para la columna de tipo de datos XML.
table_name
ahora se almacena en caché.También se realizó una gran cantidad de trabajo en el adaptador de Oracle con muchas correcciones de errores. Además de las siguientes deprecaciones:
named_scope
en una clase Active Record está obsoleto y ha sido renombrado ascope
.En los métodos
scope
, debes usar los métodos de relación en lugar de un método de búsqueda:conditions => {}
, por ejemploscope :since, lambda {|time| where("created_at > ?", time) }
.save(false)
está obsoleto, en favor desave(:validate => false)
.Los mensajes de error de I18n para Active Record deben cambiarse de :en.activerecord.errors.template a
:en.errors.template
.model.errors.on
está obsoleto, en favor demodel.errors[]
validates_presence_of => validates... :presence => true
ActiveRecord::Base.colorize_logging
yconfig.active_record.colorize_logging
están obsoletos, en favor deRails::LogSubscriber.colorize_logging
oconfig.colorize_logging
NOTA: Aunque una implementación de State Machine ha estado en Active Record durante algunos meses, se ha eliminado de la versión 3.0 de Rails.
10 Active Resource
Active Resource también se extrajo a Active Model, lo que te permite usar objetos de Active Resource con Action Pack sin problemas.
- Se agregaron validaciones a través de Active Model.
- Se agregaron ganchos de observación.
- Soporte para proxy HTTP.
- Se agregó soporte para autenticación digest.
- Se movió el nombre del modelo a Active Model.
- Se cambiaron los atributos de Active Resource a un Hash con acceso indiferente.
- Se agregaron alias
first
,last
yall
para los ámbitos de búsqueda equivalentes. find_every
ahora no devuelve un errorResourceNotFound
si no se encuentra nada.- Se agregó
save!
que genera un errorResourceInvalid
a menos que el objeto seavalido?
. - Se agregaron
update_attribute
yupdate_attributes
a los modelos de Active Resource. - Se agregó
exists?
. - Se renombró
SchemaDefinition
aSchema
ydefine_schema
aschema
. - Usa el
formato
de Active Resources en lugar delcontent-type
de los errores remotos para cargar los errores. - Usa
instance_eval
para el bloque de esquema. - Corrige
ActiveResource::ConnectionError#to_s
cuando@response
no responde a #code o #message, maneja la compatibilidad con Ruby 1.9. - Agrega soporte para errores en formato JSON.
- Asegura que
load
funcione con matrices numéricas. - Reconoce una respuesta 410 del recurso remoto como que el recurso ha sido eliminado.
- Agrega la capacidad de establecer opciones SSL en las conexiones de Active Resource.
- Establecer el tiempo de espera de la conexión también afecta a
Net::HTTP
open_timeout
.
Deprecaciones:
save(false)
está obsoleto, en favor desave(:validate => false)
.- Ruby 1.9.2:
URI.parse
y.decode
están obsoletos y ya no se utilizan en la biblioteca.
11 Active Support
Se hizo un gran esfuerzo en Active Support para hacerlo seleccionable, es decir, ya no es necesario requerir toda la biblioteca de Active Support para obtener partes de ella. Esto permite que los diversos componentes principales de Rails se ejecuten de forma más ligera.
Estos son los principales cambios en Active Support:
- Gran limpieza de la biblioteca eliminando métodos no utilizados en todo.
- Active Support ya no proporciona versiones vendidas de TZInfo, Memcache Client y Builder. Todos estos se incluyen como dependencias e se instalan a través del comando
bundle install
. - Se implementan buffers seguros en
ActiveSupport::SafeBuffer
. - Se agregan
Array.uniq_by
yArray.uniq_by!
. - Se eliminan
Array#rand
y se retrotraeArray#sample
de Ruby 1.9. - Se soluciona un error en
TimeZone.seconds_to_utc_offset
que devuelve un valor incorrecto. - Se agrega middleware
ActiveSupport::Notifications
. ActiveSupport.use_standard_json_time_format
ahora tiene el valor predeterminado en true.ActiveSupport.escape_html_entities_in_json
ahora tiene el valor predeterminado en false.Integer#multiple_of?
acepta cero como argumento, devuelve false a menos que el receptor sea cero.string.chars
se ha renombrado astring.mb_chars
.ActiveSupport::OrderedHash
ahora puede deserializarse a través de YAML.- Se agrega un analizador basado en SAX para XmlMini, utilizando LibXML y Nokogiri.
- Se agrega
Object#presence
que devuelve el objeto si es#present?
de lo contrario devuelvenil
. - Se agrega la extensión principal
String#exclude?
que devuelve el inverso de#include?
. - Se agrega
to_i
aDateTime
enActiveSupport
para queto_yaml
funcione correctamente en modelos con atributosDateTime
. - Se agrega
Enumerable#exclude?
para igualarEnumerable#include?
y evitar!x.include?
. - Cambio a escape de XSS activado por defecto para rails.
- Soporte para combinación profunda en
ActiveSupport::HashWithIndifferentAccess
. Enumerable#sum
ahora funciona con todos los enumerables, incluso si no responden a:size
.inspect
en una duración de longitud cero devuelve '0 segundos' en lugar de una cadena vacía.- Agrega
element
ycollection
aModelName
. String#to_time
yString#to_datetime
manejan segundos fraccionarios.- Se agrega soporte para nuevos callbacks para el objeto de filtro alrededor que responde a
:before
y:after
utilizados en callbacks antes y después. - El método
ActiveSupport::OrderedHash#to_a
devuelve un conjunto ordenado de matrices. Coincide conHash#to_a
de Ruby 1.9. MissingSourceFile
existe como una constante pero ahora es igual aLoadError
.- Se agrega
Class#class_attribute
, para poder declarar un atributo de nivel de clase cuyo valor es heredable y sobrescribible por las subclases. - Finalmente se eliminó
DeprecatedCallbacks
enActiveRecord::Associations
. Object#metaclass
ahora esKernel#singleton_class
para coincidir con Ruby. Los siguientes métodos han sido eliminados porque ahora están disponibles en Ruby 1.8.7 y 1.9.Integer#even?
yInteger#odd?
String#each_char
String#start_with?
yString#end_with?
(se mantienen los alias en tercera persona)String#bytesize
Object#tap
Symbol#to_proc
Object#instance_variable_defined?
Enumerable#none?
El parche de seguridad para REXML permanece en Active Support porque las primeras versiones de Ruby 1.8.7 aún lo necesitan. Active Support sabe si debe aplicarlo o no.
Los siguientes métodos han sido eliminados porque ya no se utilizan en el framework:
Kernel#daemonize
Object#remove_subclasses_of
Object#extend_with_included_modules_from
,Object#extended_by
Class#remove_class
Regexp#number_of_captures
,Regexp.unoptionalize
,Regexp.optionalize
,Regexp#number_of_captures
12 Action Mailer
Action Mailer ha recibido una nueva API con TMail siendo reemplazado por la nueva Mail como la biblioteca de correo electrónico. Action Mailer en sí ha sido completamente reescrito con prácticamente cada línea de código modificada. El resultado es que Action Mailer ahora simplemente hereda de Abstract Controller y envuelve la gema Mail en un DSL de Rails. Esto reduce considerablemente la cantidad de código y duplicación de otras bibliotecas en Action Mailer.
- Todos los mailers ahora están en
app/mailers
por defecto. - Ahora se puede enviar correo electrónico utilizando la nueva API con tres métodos:
attachments
,headers
ymail
. - Action Mailer ahora tiene soporte nativo para adjuntos en línea utilizando el método
attachments.inline
. - Los métodos de envío de correo electrónico de Action Mailer ahora devuelven objetos
Mail::Message
, que luego pueden enviar el mensajedeliver
para enviarse a sí mismos. - Todos los métodos de envío se abstraen ahora en la gema Mail.
- El método de envío de correo puede aceptar un hash de todos los campos de encabezado de correo válidos con su par de valores.
- El método de envío
mail
actúa de manera similar arespond_to
de Action Controller, y se pueden renderizar plantillas de forma explícita o implícita. Action Mailer convertirá el correo electrónico en un correo electrónico multipartes según sea necesario. - Se puede pasar un proc a las llamadas
format.mime_type
dentro del bloque de correo y renderizar explícitamente tipos específicos de texto, o agregar diseños o plantillas diferentes. La llamadarender
dentro del proc es de Abstract Controller y admite las mismas opciones. - Las pruebas unitarias de correo electrónico se han movido a pruebas funcionales.
- Action Mailer ahora delega toda la codificación automática de campos de encabezado y cuerpos a la gema Mail.
- Action Mailer codificará automáticamente los cuerpos y encabezados de correo electrónico por usted.
Deprecaciones:
:charset
,:content_type
,:mime_version
,:implicit_parts_order
están todos deprecados a favor de declaraciones de estiloActionMailer.default :key => value
.- Los métodos dinámicos
create_method_name
ydeliver_method_name
de Mailer están deprecados, simplemente llame amethod_name
que ahora devuelve un objetoMail::Message
. ActionMailer.deliver(message)
está deprecado, simplemente llame amessage.deliver
.template_root
está deprecado, pase opciones a una llamada de render dentro de un proc desde el métodoformat.mime_type
dentro del bloque de generación demail
.- El método
body
para definir variables de instancia está deprecado (body {:ivar => value}
), simplemente declare las variables de instancia directamente en el método y estarán disponibles en la vista. - Está deprecado que los mailers estén en
app/models
, en su lugar useapp/mailers
.
Más información:
13 Créditos
Consulte la lista completa de contribuyentes a Rails para conocer a las muchas personas que pasaron muchas horas haciendo Rails 3. Felicitaciones a todos ellos.
Las Notas de la Versión 3.0 de Rails fueron compiladas por Mikel Lindsaar.
Comentarios
Se te anima a ayudar a mejorar la calidad de esta guía.
Por favor, contribuye si encuentras algún error tipográfico o factual. Para empezar, puedes leer nuestra contribución a la documentación sección.
También puedes encontrar contenido incompleto o desactualizado. Por favor, añade cualquier documentación faltante para main. Asegúrate de revisar Edge Guides primero para verificar si los problemas ya están resueltos o no en la rama principal. Consulta las Directrices de las Guías de Ruby on Rails para el estilo y las convenciones.
Si por alguna razón encuentras algo que corregir pero no puedes solucionarlo tú mismo, por favor abre un problema.
Y por último, cualquier tipo de discusión sobre la documentación de Ruby on Rails es muy bienvenida en el Foro oficial de Ruby on Rails.