A partir del 23 de diciembre de 2008, el proyecto Merb (Mongrel + Erb) se fusionará con Rails, y en 2010 se lanzará una versión con las mejores características de ambos con el nombre Rieles 3. Principales adiciones en Rails 3.0 – Nuevo enrutador con énfasis en declaraciones RESTful – Nueva API Action Mailer modelada a partir de Action Controller – Nuevo lenguaje de consulta encadenable Active Record construido sobre álgebra relacional – Asistentes de Javascript discretos con controladores para Prototype y jQuery
Casi todas las propiedades de Rails se han actualizado en Rails 3.0. A continuación se enumeran todas las propiedades y sus actualizaciones y adiciones a la versión anterior: Los cambios básicos incluyen lo siguiente: – Rieles 3.0 solo admite Ruby 1.8.7 y superior – Objeto de aplicación Para ejecutar varias aplicaciones Rails en el mismo proceso, se ha introducido un nuevo concepto llamado objeto Aplicación. Un objeto de aplicación contiene todas las configuraciones específicas de la aplicación y es de naturaleza muy similar a config/environment.rb de las versiones anteriores de Rails.- Guion/* El nuevo script/rails reemplaza todos los scripts que solían estar en el directorio de scripts. Por ejemplo: en lugar de script/consola, rieles de consola en lugar de script/generar título de publicación de andamio: rieles de cadena g título de publicación de andamio: cadena – Archivo de gemas y paqueter Rails ahora usa un Gemfile en la raíz de la aplicación para determinar las gemas que necesita para que se inicie su aplicación. Este Gemfile es procesado por Bundler, que luego instala todas sus dependencias. Bundler es una herramienta que gestiona las dependencias de gemas para tu aplicación Ruby. Puede recuperar, descargar e instalar las gemas y todas las dependencias secundarias especificadas en el archivo de manifiesto. El comando 'gem install bundler' instalará esta gema. – Todos los componentes principales de Rails han sido desacoplados. Los componentes principales de Rails ahora usan la misma API que usted puede usar para desarrollar complementos. Esto significa que cualquier complemento que cree puede acceder a todas las funciones a las que tienen acceso los componentes principales de Rails. Los complementos ORM ahora solo necesitan implementar interfaces Active Model para funcionar sin problemas con Action Pack. arel Arel es una interpretación orientada a objetos del álgebra de relaciones. Proporciona una abstracción de SQL que simplifica Active Record y proporciona la base para la funcionalidad de relación en Active Record. Se analiza más sobre Arel en la parte de Registro activo del artículo. Internacionalización – Se ha introducido una gema de internacionalización llamada gema I18n que se utiliza para admitir la programación en varios idiomas regionales. Generadores – Se prestó mucha atención a los generadores en Rails 3.0. Algunos de los muchos cambios y adiciones realizadas fueron: Los generadores fueron completamente reescritos y son incompatibles con versiones anteriores. La API de plantillas de Rails y la API de generadores ahora están fusionadas. Los generadores ya no se cargan desde rutas especiales, simplemente se encuentran en la ruta de carga de Ruby, por lo que llamar a Rails generate foo buscará generadores/foo_generator. Los nuevos generadores proporcionan enlaces, por lo que cualquier motor de plantillas, ORM o marco de prueba puede conectarse fácilmente. Los nuevos generadores le permiten anular las plantillas colocando una copia en RAILS_ROOT/lib/templates. Rails::Generators::TestCase también se suministra para que puedas crear tus propios generadores y probarlos. Controlador de acción ActionController y ActionMailer se han simplificado enormemente al eliminar el código común de todas estas bibliotecas y colocarlo en un AbstractController. Abstract Controller extrae las partes genéricas de Action Controller en un módulo reutilizable que cualquier biblioteca puede usar para representar plantillas, representar parciales, ayudas, traducciones, registros y cualquier parte del ciclo de respuesta a la solicitud. application_controller.rb ahora tiene protect_from_forgery activado de forma predeterminada. El cookie_verifier_secret se ha movido a inicializadores/cookie_verification_secret.rb. La configuración de session_store se ha movido a inicializadores/session_store.rb. cookies.secure le permite establecer valores cifrados en las cookies con cookie.secure[:key] => valor. cookies.permanent le permite establecer valores permanentes en el hash de la cookie cookie.permanent[:key] => valor que genera excepciones en los valores firmados si falla la verificación. Ahora puede pasar :notice => 'Este es un mensaje flash' o :alert => 'Algo salió mal' a la llamada de formato dentro de un bloque respond_to. El hash flash[] todavía funciona como antes. El método respond_with ahora se ha agregado a sus controladores, simplificando los venerables bloques de formato. ActionController::Responder agregado que le permite flexibilidad en cómo se generan sus respuestas. AcciónMailer La creación de AbstractController permitió a ActionMailer::Base ahora simplemente heredar de AbstractController y simplemente envolver Rails DSL en la gema Mail. Esto reduce considerablemente la cantidad de código y la duplicación de otras bibliotecas en Action Mailer. – Todas las funciones relacionadas con los mensajes de correo electrónico se han resumido en la gema Mail. Esto reduce la duplicación de código y ayuda a crear límites definibles entre Action Mailer y el analizador de correo electrónico. – Lo que eran pruebas unitarias de correo se han trasladado a pruebas funcionales. – Ahora puedes enviar correos electrónicos usando la nueva API con tres métodos: archivos adjuntos, encabezados y correo. Vista de acción Se implementó JavaScript discreto (UJS) y se eliminaron los antiguos comandos AJAX en línea. Esto permite a Rails utilizar cualquier controlador UJS compatible para implementar los ganchos UJS en los ayudantes. Lo que significa que todos los ayudantes remotos anteriores se eliminaron del núcleo de Rails y se colocaron en Prototype Legacy Helper. Para obtener ganchos UJS en su HTML, ahora pase :remote => true en su lugar. Por ejemplo: form_for @post :remote => true Ya no necesita llamar a h(string) para escapar de la salida HTML, está activado de forma predeterminada en todas las plantillas de vista. Si desea la cadena sin escape, llame a raw(string). Los ayudantes ahora generan HTML 5 de forma predeterminada. El asistente de etiqueta de formulario ahora extrae valores de I18n con un solo valor, por lo que f.label :name extraerá la traducción :name. I18n seleccione la etiqueta 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 Ruby dentro de una plantilla ERb para eliminar el retorno de carro final en la salida HTML. Se agregó el asistente grouped_collection_select a la Vista de acciones. La Vista de acción ahora generará excepciones si faltan las hojas de estilo CSS y los archivos javascript enumerados en los ayudantes javascript_include_tag y stylesheet_include_tag. contenido_para? Se ha agregado que le permite verificar la existencia de contenido en una vista antes de renderizarla. Registro activo La incorporación de Arel ahora permite que Active Record devuelva relaciones en sus métodos. Estas relaciones pueden encadenarse. Algunos de los métodos que los proporcionan son: dónde: proporciona condiciones sobre la relación, qué se devuelve. seleccionar: elija qué atributos de los modelos desea que se devuelvan de la base de datos. grupo: agrupa la relación en el atributo proporcionado. tener: proporciona una expresión que limita las relaciones de grupo (restricción GROUP BY). se une: une la relación a otra tabla. cláusula: proporciona una expresión que limita las relaciones de unión (restricción JOIN). Incluye: incluye otras relaciones precargadas. orden: ordena la relación según la expresión proporcionada. límite: limita la relación con el número de registros especificados. lock: bloquea los registros devueltos por la tabla. solo lectura: devuelve una copia de los datos de solo lectura. from: proporciona una manera de seleccionar relaciones de más de una tabla. alcance: (anteriormente llamado_alcance) devuelve relaciones y se puede encadenar junto con los otros métodos de relación. with_scope – y with_exclusive_scope ahora también devuelven relaciones y, por lo tanto, se pueden encadenar. Un ejemplo que utiliza algunos de los métodos mencionados anteriormente red_items = Item.where(:color => 'red') red_items.find(1) item = red_items.new Ahora, dando un item.color daría la salida => red
red_items.existe? red_items.update_all: color => 'negro' red_items.exists? Da una salida => falso
Tomando otro ejemplo
cars = Car.where(:color => 'negro') Esto no daría ningún resultado de consulta. Si queremos disparar un select entonces necesitamos agregar los siguientes autos.cada uno {|c| pone c.nombre }
La relación anterior se llama carga diferida. Esto es muy útil junto con el almacenamiento en caché de fragmentos laterales. Entonces, en la acción de tu controlador, podrías simplemente hacer
def index @recent_items = Item.limit(10).order('created_at DESC') fin
Y en su opinión: <% cache('recent_items') do %> <% @recent_items.each do |item| %> … <% fin %> En el ejemplo anterior, @recent_items se cargan en @recent_items.cada llamada desde la vista. Como el controlador en realidad no activa ninguna consulta, el almacenamiento en caché de fragmentos se vuelve más efectivo sin requerir soluciones especiales. También se han realizado algunas mejoras a la antigua API, que son: Agregado: ¿destruido? a objetos de Registro Activo. La compatibilidad con SQLite 2 se ha eliminado en favor de SQLite 3. Soporte MySQL para el orden de las columnas. Se corrigió el soporte del adaptador PostgreSQL para ZONA HORARIA, por lo que ya no inserta valores incorrectos. Admite múltiples esquemas en nombres de tablas para PostgreSQL. Soporte de PostgreSQL para la columna de tipo de datos XML. table_name ahora está almacenado en caché. También se realizó una gran cantidad de trabajo en el adaptador de Oracle con muchas correcciones de errores. name_scope en una clase Active Record está en desuso y se le ha cambiado el nombre a solo alcance. En los métodos de alcance, debe pasar a utilizar los métodos de relación, en lugar de
:condiciones => {} método del buscador, por ejemplo alcance :since, lambda {|time| donde(“creado_en >?”, hora) }. save(false) está en desuso, a favor de save(:validate => false). Los mensajes de error I18n para ActiveRecord se deben cambiar de :en.activerecord.errors.template a :en.errors.template. model.errors.on está en desuso en favor de model.errors[] valida_presencia_of => valida. :presence => true ActiveRecord::Base.colorize_logging y config.active_record.colorize_logging están en desuso en favor de Rails::Subscriber.colorize_logging o config.colorize_logging find(:first) y find(:all) (sin ninguna opción) también lo están quedando obsoleto en favor de primero y todo. Modelo activo Rails 2.3 tiene un montón de funcionalidades realmente interesantes encerradas en componentes monolíticos. Rails 3 ha abierto gran parte de esa funcionalidad en ActionPack, facilitando la reutilización del enrutador, el despachador y partes individuales de ActionController. Las validaciones se han movido de Active Record a Active Model, lo que proporciona una interfaz para las validaciones que funciona en todas las bibliotecas ORM en Rails 3. Ahora hay un método abreviado de validaciones: atributo, opciones_hash que le permite pasar opciones para todos los métodos de clase de validación. Puede pasar más de una opción a un método de validación. El método de validación tiene las siguientes opciones: :aceptación => Booleano. :confirmación => Booleano. :exclusión => { :in => Ennumerable }. :inclusión => { :in => Ennumerable }. :formato => { :con => Regexp, :on => :crear }. :longitud => { :máximo => Fixnum }. :numericalidad => booleano. :presencia => Booleano. :singularidad => booleano. Despacho de acción Se realiza una implementación nueva y limpia del enrutamiento utilizando ActionDispatch. Las rutas definidas por cada aplicación ahora tienen nombres espaciados dentro de su módulo de Aplicación. Por ejemplo: la primera línea del archivo routers.rb, es decir, ActionController: :Routing: :Routes.draw do |map| map.resources: final de la publicación ha sido reemplazado por AppName:: Application.routes do resources: final de las publicaciones Se ha agregado el método de coincidencia al enrutador. Cualquier aplicación de Rack se puede pasar a la ruta correspondiente. Las rutas se pueden expresar mediante bloques, por ejemplo, puedes llamar al controlador :home { match '/:action' }. Por ejemplo: map.connect 'productos/:id', :controller => 'catalog',:action =>'view' coincide con 'products/:id' => 'catalog#view' Si bien gran parte de Rails 3 está experimentando una reescritura interna, Routes DSL ha experimentado una revisión completa en Rails 3. Se ha reescrito desde cero varias veces antes y ha aportado velocidad y flexibilidad con cada iteración. El nuevo DSL requiere menos pulsaciones de teclas y parece limpio. Aquí hay un archivo de ruta RESTful típico en Rails 2: map.resources :products, :member => {:short => :post}, :collection => {:long => :get} do |products| productos.recurso: fin de categoría Así es como se ve en Rails 3: recursos: productos hacen recurso: categoría miembro publica: final corto la colección obtiene: final largo
Se han realizado muchas adiciones y cambios a muchas propiedades de Rails. Aunque puede que sea demasiado pronto para que algunos de nosotros cambiemos nuestra visión sobre las nuevas API y su sintaxis, el antiguo estilo de sintaxis todavía funciona debido a una capa de compatibilidad con versiones anteriores que se ha agregado. Sin embargo, esto se eliminará en la versión Rails 3.1.
Póngase en contacto con nosotros.