1 Actualización a Rails 4.0
Si está actualizando una aplicación existente, es una buena idea tener una buena cobertura de pruebas antes de comenzar. También debe actualizar primero a Rails 3.2 en caso de que no lo haya hecho y asegurarse de que su aplicación siga funcionando como se espera antes de intentar una actualización a Rails 4.0. Una lista de cosas a tener en cuenta al actualizar está disponible en la guía Actualización de Ruby on Rails.
2 Creación de una aplicación Rails 4.0
# Debe tener instalada la gema 'rails'
$ rails new myapp
$ cd myapp
2.1 Vinculación de gemas
Rails ahora utiliza un Gemfile
en la raíz de la aplicación para determinar las gemas que necesita su aplicación para iniciar. Este Gemfile
es procesado por la gema Bundler, que luego instala todas las dependencias. Incluso puede instalar todas las dependencias localmente en su aplicación para que no dependa de las gemas del sistema.
Más información: Página principal de Bundler
2.2 Vivir al límite
Bundler
y Gemfile
hacen que congelar su aplicación Rails sea pan comido con el nuevo comando bundle
dedicado. Si desea agrupar directamente desde el repositorio Git, puede pasar la bandera --edge
:
$ rails new myapp --edge
Si tiene una copia local del repositorio de Rails y desea generar una aplicación utilizando eso, puede pasar la bandera --dev
:
$ ruby /ruta/a/rails/railties/bin/rails new myapp --dev
3 Funcionalidades principales
3.1 Actualización
- Ruby 1.9.3 (confirmación) - Se prefiere Ruby 2.0; se requiere 1.9.3+
- Nueva política de deprecación - Las características obsoletas son advertencias en Rails 4.0 y se eliminarán en Rails 4.1.
- Caché de página y acción de ActionPack (confirmación) - La caché de página y acción se extrae a una gema separada. La caché de página y acción requiere demasiada intervención manual (caducar manualmente las cachés cuando se actualizan los objetos de modelo subyacentes). En su lugar, use la caché de muñecas rusas.
- Observadores de ActiveRecord (confirmación) - Los observadores se extraen a una gema separada. Los observadores solo son necesarios para la caché de página y acción, y pueden generar código espagueti.
- Almacenamiento de sesión de ActiveRecord (confirmación) - El almacenamiento de sesión de ActiveRecord se extrae a una gema separada. Almacenar sesiones en SQL es costoso. En su lugar, use sesiones de cookies, sesiones de memcache o un almacenamiento de sesión personalizado.
- Protección de asignación masiva de ActiveModel (confirmación) - La protección de asignación masiva de Rails 3 está obsoleta. En su lugar, use parámetros fuertes.
- ActiveResource (confirmación) - ActiveResource se extrae a una gema separada. ActiveResource no se usaba ampliamente.
- vendor/plugins eliminado (confirmación) - Use un
Gemfile
para administrar las gemas instaladas.
3.2 ActionPack
- Parámetros fuertes (confirmación) - Solo permita que los parámetros permitidos actualicen objetos de modelo (
params.permit(:title, :text)
). - Preocupaciones de enrutamiento (confirmación) - En el DSL de enrutamiento, factorice subrutas comunes (
comments
de/posts/1/comments
y/videos/1/comments
). - ActionController::Live (confirmación) - Transmita JSON con
response.stream
. - ETags declarativos (confirmación) - Agregue adiciones de etag a nivel de controlador que formarán parte del cálculo de etag de la acción.
- Caché de muñecas rusas (confirmación) - Almacene en caché fragmentos anidados de vistas. Cada fragmento caduca en función de un conjunto de dependencias (una clave de caché). La clave de caché suele ser un número de versión de plantilla y un objeto de modelo.
- Turbolinks (confirmación) - Sirva solo una página HTML inicial. Cuando el usuario navega a otra página, use pushState para actualizar la URL y use AJAX para actualizar el título y el cuerpo.
- Desacoplar ActionView de ActionController (confirmación) - ActionView se desacopló de ActionPack y se moverá a una gema separada en Rails 4.1.
No depender de ActiveModel (confirmación) - ActionPack ya no depende de ActiveModel.
General
- ActiveModel::Model (commit) -
ActiveModel::Model
, una mezcla para hacer que los objetos normales de Ruby funcionen con ActionPack sin problemas (por ejemplo, paraform_for
). - Nueva API de alcance (commit) - Los alcances siempre deben usar funciones llamables.
- Volcado de caché de esquema (commit) - Para mejorar el tiempo de inicio de Rails, en lugar de cargar el esquema directamente desde la base de datos, cargar el esquema desde un archivo de volcado.
- Soporte para especificar el nivel de aislamiento de la transacción (commit) - Elija si las lecturas repetibles o el rendimiento mejorado (menos bloqueo) son más importantes.
- Dalli (commit) - Utilice el cliente de memcache Dalli para la tienda de memcache.
- Inicio y finalización de notificaciones (commit) - La instrumentación de Active Support informa las notificaciones de inicio y finalización a los suscriptores.
- Seguridad por defecto (commit) - Rails puede ejecutarse en servidores de aplicaciones con hilos sin configuración adicional.
- ActiveModel::Model (commit) -
NOTA: Verifique que las gemas que está utilizando sean seguras para hilos.
- Verbo PATCH (commit) - En Rails, PATCH reemplaza a PUT. PATCH se utiliza para actualizaciones parciales de recursos.
3.3 Seguridad
- match no captura todo (commit) - En el DSL de enrutamiento, match requiere que se especifique el verbo o verbos HTTP.
- Entidades HTML escapadas por defecto (commit) - Las cadenas renderizadas en erb se escapan a menos que se envuelvan con
raw
o se llame ahtml_safe
. - Nuevas cabeceras de seguridad (commit) - Rails envía las siguientes cabeceras con cada solicitud HTTP:
X-Frame-Options
(evita el clickjacking al prohibir que el navegador incruste la página en un marco),X-XSS-Protection
(pide al navegador que detenga la inyección de scripts) yX-Content-Type-Options
(evita que el navegador abra un jpeg como un exe).
4 Extracción de características a gemas
En Rails 4.0, varias características se han extraído a gemas. Simplemente agregue las gemas extraídas a su Gemfile
para recuperar la funcionalidad.
- Métodos de búsqueda basados en hash y dinámicos (GitHub)
- Protección de asignación masiva en modelos de Active Record (GitHub, Pull Request)
- ActiveRecord::SessionStore (GitHub, Pull Request)
- Observadores de Active Record (GitHub, Commit)
- Active Resource (GitHub, Pull Request, Blog)
- Caché de acciones (GitHub, Pull Request)
- Caché de páginas (GitHub, Pull Request)
- Sprockets (GitHub)
- Pruebas de rendimiento (GitHub, Pull Request)
5 Documentación
Las guías se han reescrito en Markdown con formato GitHub.
Las guías tienen un diseño receptivo.
6 Railties
Consulte el Registro de cambios para obtener cambios detallados.
6.1 Cambios destacados
Nuevas ubicaciones de pruebas
test/models
,test/helpers
,test/controllers
ytest/mailers
. También se agregaron tareas de rake correspondientes. (Pull Request)Los ejecutables de su aplicación ahora se encuentran en el directorio
bin/
. Ejecuterake rails:update:bin
para obtenerbin/bundle
,bin/rails
ybin/rake
.Seguridad por defecto
Se ha eliminado la capacidad de usar un constructor personalizado pasando
--builder
(o-b
) arails new
. Considere usar plantillas de aplicación en su lugar. (Pull Request)
6.2 Deprecaciones
config.threadsafe!
está en desuso a favor deconfig.eager_load
, que proporciona un control más detallado sobre qué se carga de forma anticipada.Rails::Plugin
ha desaparecido. En lugar de agregar complementos avendor/plugins
, use gemas o bundler con dependencias de ruta o git.
7 Action Mailer
Consulte el Registro de cambios para obtener cambios detallados.
7.1 Cambios destacados
7.2 Deprecaciones
8 Active Model
Consulte el Registro de cambios para obtener cambios detallados.
8.1 Cambios destacados
Agregue
ActiveModel::ForbiddenAttributesProtection
, un módulo simple para proteger los atributos de la asignación masiva cuando se pasan atributos no permitidos.Se agregó
ActiveModel::Model
, una mezcla para hacer que los objetos de Ruby funcionen con Action Pack sin problemas.
8.2 Deprecaciones
9 Active Support
Consulte el Registro de cambios para obtener cambios detallados.
9.1 Cambios destacados
Reemplace la gema
memcache-client
obsoleta pordalli
enActiveSupport::Cache::MemCacheStore
.Optimice
ActiveSupport::Cache::Entry
para reducir la memoria y la sobrecarga de procesamiento.Las inflexiones ahora se pueden definir por localidad.
singularize
ypluralize
aceptan la localidad como un argumento adicional.Object#try
ahora devolverá nil en lugar de generar un NoMethodError si el objeto receptor no implementa el método, pero aún puede obtener el comportamiento anterior utilizando el nuevoObject#try!
.String#to_date
ahora lanzaArgumentError: invalid date
en lugar deNoMethodError: undefined method 'div' for nil:NilClass
cuando se le proporciona una fecha inválida. Ahora es igual queDate.parse
y acepta más fechas inválidas que en la versión 3.x, como:# ActiveSupport 3.x "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass # ActiveSupport 4 "asdf".to_date # => ArgumentError: invalid date "333".to_date # => Fri, 29 Nov 2013
9.2 Deprecaciones
Se deprecia el método
ActiveSupport::TestCase#pending
, en su lugar se debe usarskip
de minitest.ActiveSupport::Benchmarkable#silence
ha sido deprecado debido a su falta de seguridad en hilos. Será eliminado sin reemplazo en Rails 4.1.ActiveSupport::JSON::Variable
está deprecado. Define tus propios métodos#as_json
y#encode_json
para literales de cadena JSON personalizados.Se deprecia el método de compatibilidad
Module#local_constant_names
, en su lugar se debe usarModule#local_constants
(que devuelve símbolos).ActiveSupport::BufferedLogger
está deprecado. UsaActiveSupport::Logger
o el registro de la biblioteca estándar de Ruby.Se deprecia
assert_present
yassert_blank
en favor deassert object.blank?
yassert object.present?
10 Action Pack
Consulta el Changelog para obtener cambios detallados.
10.1 Cambios destacados
- Cambia la hoja de estilos de las páginas de excepción para el modo de desarrollo. Además, muestra también la línea de código y el fragmento que generó la excepción en todas las páginas de excepción.
10.2 Deprecaciones
11 Active Record
Consulta el Changelog para obtener cambios detallados.
11.1 Cambios destacados
Mejora las formas de escribir migraciones
change
, haciendo que los antiguos métodosup
ydown
ya no sean necesarios.- Los métodos
drop_table
yremove_column
ahora son reversibles, siempre y cuando se proporcione la información necesaria. El métodoremove_column
solía aceptar múltiples nombres de columna; en su lugar, usaremove_columns
(que no es reversible). El métodochange_table
también es reversible, siempre y cuando su bloque no llame aremove
,change
ochange_default
. - El nuevo método
reversible
permite especificar código que se ejecutará al migrar hacia arriba o hacia abajo. Consulta la Guía de migraciones - El nuevo método
revert
revertirá una migración completa o el bloque dado. Si se está migrando hacia abajo, la migración/bloque dado se ejecutará normalmente. Consulta la Guía de migraciones
- Los métodos
Agrega soporte para el tipo de array de PostgreSQL. Se puede utilizar cualquier tipo de dato para crear una columna de array, con soporte completo de migración y volcado de esquema.
Agrega
Relation#load
para cargar explícitamente el registro y devolverself
.Model.all
ahora devuelve unaActiveRecord::Relation
, en lugar de un array de registros. UsaRelation#to_a
si realmente quieres un array. En algunos casos específicos, esto puede causar problemas al actualizar.Se agregó
ActiveRecord::Migration.check_pending!
que genera un error si hay migraciones pendientes.Se agregó soporte para codificadores personalizados en
ActiveRecord::Store
. Ahora puedes configurar tu codificador personalizado de la siguiente manera:store :settings, accessors: [ :color, :homepage ], coder: JSON
Las conexiones
mysql
ymysql2
estableceránSQL_MODE=STRICT_ALL_TABLES
de forma predeterminada para evitar la pérdida silenciosa de datos. Esto se puede desactivar especificandostrict: false
en tudatabase.yml
.Se eliminó IdentityMap.
Se eliminó la ejecución automática de consultas EXPLAIN. La opción
active_record.auto_explain_threshold_in_seconds
ya no se utiliza y se debe eliminar.Se agregó
ActiveRecord::NullRelation
yActiveRecord::Relation#none
implementando el patrón de objeto nulo para la clase Relation.Se agregó el ayudante de migración
create_join_table
para crear tablas de unión HABTM.Permite crear registros hstore de PostgreSQL.
11.2 Deprecaciones
Se deprecó la API de búsqueda basada en hash de estilo antiguo. Esto significa que los métodos que anteriormente aceptaban "opciones de búsqueda" ya no lo hacen.
Todos los métodos dinámicos, excepto
find_by_...
yfind_by_...!
, están deprecados. Así es como puedes reescribir el código:find_all_by_...
se puede reescribir usandowhere(...)
.find_last_by_...
se puede reescribir usandowhere(...).last
.scoped_by_...
se puede reescribir usandowhere(...)
.find_or_initialize_by_...
se puede reescribir usandofind_or_initialize_by(...)
.find_or_create_by_...
se puede reescribir usandofind_or_create_by(...)
.find_or_create_by_...!
se puede reescribir usandofind_or_create_by!(...)
.
12 Créditos
Consulta la lista completa de colaboradores de Rails para conocer a las muchas personas que dedicaron muchas horas para hacer de Rails el marco estable y robusto que es. Felicitaciones a todos ellos.
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.