Ruby on Rails avanzado
Esteban Manchado Velázquez
[email protected]
24 de noviembre de 2005
Índice
1 MVC
Modelo
Vista
Controlador
2 Facilidades adicionales
Entornos
ActionMailer
Extensiones al lenguaje
3 Conclusiones
Lo bueno/lo malo
Consejos varios
Índice
1 MVC
Modelo
Vista
Controlador
2 Facilidades adicionales
Entornos
ActionMailer
Extensiones al lenguaje
3 Conclusiones
Lo bueno/lo malo
Consejos varios
Relaciones
• Los modelos están relacionados entre sí
Relaciones
• Los modelos están relacionados entre sí
• Hay varias relaciones definidas en Rails
Relaciones
• Los modelos están relacionados entre sí
• Hay varias relaciones definidas en Rails
• has many, belongs to, has and belongs to, etc.
Relaciones
• Los modelos están relacionados entre sí
• Hay varias relaciones definidas en Rails
• has many, belongs to, has and belongs to, etc.
• Declaración en los modelos, limpia y legible
Relaciones
• Los modelos están relacionados entre sí
• Hay varias relaciones definidas en Rails
• has many, belongs to, has and belongs to, etc.
• Declaración en los modelos, limpia y legible
• Convenciones para reducir al mínimo el código...
Relaciones
• Los modelos están relacionados entre sí
• Hay varias relaciones definidas en Rails
• has many, belongs to, has and belongs to, etc.
• Declaración en los modelos, limpia y legible
• Convenciones para reducir al mínimo el código...
• ...aunque todo se puede personalizar, claro
Relaciones
• Los modelos están relacionados entre sí
• Hay varias relaciones definidas en Rails
• has many, belongs to, has and belongs to, etc.
• Declaración en los modelos, limpia y legible
• Convenciones para reducir al mínimo el código...
• ...aunque todo se puede personalizar, claro
• También se pueden afinar las relaciones con condiciones
Relaciones: ejemplo
class Curso < ActiveRecord::Base
has_many :documentos
has_many :examenes, :class_name => ’Documento’,
:conditions => "tipo = ’examen’"
has_and_belongs_to_many :alumnos, :order => ’nombre’
belongs_to :temporada, :class_name => ’AnoAcademico’,
:foreign_key => ’curso_id’
end
Relaciones: ejemplo
class Curso < ActiveRecord::Base
has_many :documentos
has_many :examenes, :class_name => ’Documento’,
:conditions => "tipo = ’examen’"
has_and_belongs_to_many :alumnos, :order => ’nombre’
belongs_to :temporada, :class_name => ’AnoAcademico’,
:foreign_key => ’curso_id’
end
Relaciones: ejemplo
class Curso < ActiveRecord::Base
has_many :documentos
has_many :examenes, :class_name => ’Documento’,
:conditions => "tipo = ’examen’"
has_and_belongs_to_many :alumnos, :order => ’nombre’
belongs_to :temporada, :class_name => ’AnoAcademico’,
:foreign_key => ’curso_id’
end
Relaciones: ejemplo
class Curso < ActiveRecord::Base
has_many :documentos
has_many :examenes, :class_name => ’Documento’,
:conditions => "tipo = ’examen’"
has_and_belongs_to_many :alumnos, :order => ’nombre’
belongs_to :temporada, :class_name => ’AnoAcademico’,
:foreign_key => ’curso_id’
end
Relaciones: ejemplo
class Curso < ActiveRecord::Base
has_many :documentos
has_many :examenes, :class_name => ’Documento’,
:conditions => "tipo = ’examen’"
has_and_belongs_to_many :alumnos, :order => ’nombre’
belongs_to :temporada, :class_name => ’AnoAcademico’,
:foreign_key => ’curso_id’
end
Relaciones: ejemplo de uso
c = Curso.find(...)
c.documentos.each {|d| ...}
c.documentos.size
c.documento_ids = [1, 2, 3]
c.examenes.empty?
c.examenes << Documento.create(:tipo => ’examen’, ...)
c.alumnos.push_with_attributes(:reservado => true)
Relaciones: ejemplo de uso
c = Curso.find(...)
c.documentos.each {|d| ...}
c.documentos.size
c.documento_ids = [1, 2, 3]
c.examenes.empty?
c.examenes << Documento.create(:tipo => ’examen’, ...)
c.alumnos.push_with_attributes(:reservado => true)
Relaciones: ejemplo de uso
c = Curso.find(...)
c.documentos.each {|d| ...}
c.documentos.size
c.documento_ids = [1, 2, 3]
c.examenes.empty?
c.examenes << Documento.create(:tipo => ’examen’, ...)
c.alumnos.push_with_attributes(:reservado => true)
Relaciones: ejemplo de uso
c = Curso.find(...)
c.documentos.each {|d| ...}
c.documentos.size
c.documento_ids = [1, 2, 3]
c.examenes.empty?
c.examenes << Documento.create(:tipo => ’examen’, ...)
c.alumnos.push_with_attributes(:reservado => true)
Relaciones: ejemplo de uso
c = Curso.find(...)
c.documentos.each {|d| ...}
c.documentos.size
c.documento_ids = [1, 2, 3]
c.examenes.empty?
c.examenes << Documento.create(:tipo => ’examen’, ...)
c.alumnos.push_with_attributes(:reservado => true)
Relaciones: ejemplo de uso
c = Curso.find(...)
c.documentos.each {|d| ...}
c.documentos.size
c.documento_ids = [1, 2, 3]
c.examenes.empty?
c.examenes << Documento.create(:tipo => ’examen’, ...)
c.alumnos.push_with_attributes(:reservado => true)
Relaciones: ejemplo de uso
c = Curso.find(...)
c.documentos.each {|d| ...}
c.documentos.size
c.documento_ids = [1, 2, 3]
c.examenes.empty?
c.examenes << Documento.create(:tipo => ’examen’, ...)
c.alumnos.push_with_attributes(:reservado => true)
Validadores
• En general, se intentan mantener en el código
Validadores
• En general, se intentan mantener en el código
• Dos estrategias básicas: marcar campos o validación general
Validadores
• En general, se intentan mantener en el código
• Dos estrategias básicas: marcar campos o validación general
• Para el primer caso, tenemos varios métodos (de clase)
Validadores
• En general, se intentan mantener en el código
• Dos estrategias básicas: marcar campos o validación general
• Para el primer caso, tenemos varios métodos (de clase)
• Para el segundo podemos sobrecargar validate (de ejemplar)
Validadores
• En general, se intentan mantener en el código
• Dos estrategias básicas: marcar campos o validación general
• Para el primer caso, tenemos varios métodos (de clase)
• Para el segundo podemos sobrecargar validate (de ejemplar)
• En validate, añadimos los errores a errors
Validadores
• En general, se intentan mantener en el código
• Dos estrategias básicas: marcar campos o validación general
• Para el primer caso, tenemos varios métodos (de clase)
• Para el segundo podemos sobrecargar validate (de ejemplar)
• En validate, añadimos los errores a errors
• Podemos combinarlos, claro
Validadores: ejemplo
class Alumno < ActiveRecord::Base
validates_presence_of :num_socio
validates_inclusion_of :edad,
validates_exclusion_of :nombre,
:in => 18..100,
:message => "Dos rombos"
validates_format_of
end
:in => [’Pepito’, ’Juanito’],
:message => "Te odio"
:email,
:with => /^[\w\.]+@[\w\.]+$/
Validadores: ejemplo
class Alumno < ActiveRecord::Base
validates_presence_of :num_socio
validates_inclusion_of :edad,
validates_exclusion_of :nombre,
:in => 18..100,
:message => "Dos rombos"
validates_format_of
end
:in => [’Pepito’, ’Juanito’],
:message => "Te odio"
:email,
:with => /^[\w\.]+@[\w\.]+$/
Validadores: ejemplo
class Alumno < ActiveRecord::Base
validates_presence_of :num_socio
validates_inclusion_of :edad,
validates_exclusion_of :nombre,
:in => 18..100,
:message => "Dos rombos"
validates_format_of
end
:in => [’Pepito’, ’Juanito’],
:message => "Te odio"
:email,
:with => /^[\w\.]+@[\w\.]+$/
Validadores: ejemplo
class Alumno < ActiveRecord::Base
validates_presence_of :num_socio
validates_inclusion_of :edad,
validates_exclusion_of :nombre,
:in => 18..100,
:message => "Dos rombos"
validates_format_of
end
:in => [’Pepito’, ’Juanito’],
:message => "Te odio"
:email,
:with => /^[\w\.]+@[\w\.]+$/
Validadores: ejemplo
class Alumno < ActiveRecord::Base
validates_presence_of :num_socio
validates_inclusion_of :edad,
validates_exclusion_of :nombre,
:in => 18..100,
:message => "Dos rombos"
validates_format_of
end
:in => [’Pepito’, ’Juanito’],
:message => "Te odio"
:email,
:with => /^[\w\.]+@[\w\.]+$/
Validadores: otro ejemplo
class Alumno < ActiveRecord::Base
def validate(a)
errors.add_on_empty("num_socio")
errors.add("edad", "Muy joven") \
errors.add("email", "Dirección incorrecta") \
unless (18..100).include? a.edad
if a.email !~ /^[\w\.]+@[\w\.]+$/
end
end
Validadores: otro ejemplo
class Alumno < ActiveRecord::Base
def validate(a)
errors.add_on_empty("num_socio")
errors.add("edad", "Muy joven") \
errors.add("email", "Dirección incorrecta") \
unless (18..100).include? a.edad
if a.email !~ /^[\w\.]+@[\w\.]+$/
end
end
Validadores: otro ejemplo
class Alumno < ActiveRecord::Base
def validate(a)
errors.add_on_empty("num_socio")
errors.add("edad", "Muy joven") \
errors.add("email", "Dirección incorrecta") \
unless (18..100).include? a.edad
if a.email !~ /^[\w\.]+@[\w\.]+$/
end
end
Validadores: otro ejemplo
class Alumno < ActiveRecord::Base
def validate(a)
errors.add_on_empty("num_socio")
errors.add("edad", "Muy joven") \
errors.add("email", "Dirección incorrecta") \
unless (18..100).include? a.edad
if a.email !~ /^[\w\.]+@[\w\.]+$/
end
end
Validadores: otro ejemplo
class Alumno < ActiveRecord::Base
def validate(a)
errors.add_on_empty("num_socio")
errors.add("edad", "Muy joven") \
errors.add("email", "Dirección incorrecta") \
unless (18..100).include? a.edad
if a.email !~ /^[\w\.]+@[\w\.]+$/
end
end
Migraciones
• Expresan cambios en la base de datos
Migraciones
• Expresan cambios en la base de datos
• Sólo MySQL y PostgreSQL por ahora
Migraciones
• Expresan cambios en la base de datos
• Sólo MySQL y PostgreSQL por ahora
• Permiten actualizar fácilmente
Migraciones
• Expresan cambios en la base de datos
• Sólo MySQL y PostgreSQL por ahora
• Permiten actualizar fácilmente
• Son clases en ficheros independientes (en db/migrate)
Migraciones
• Expresan cambios en la base de datos
• Sólo MySQL y PostgreSQL por ahora
• Permiten actualizar fácilmente
• Son clases en ficheros independientes (en db/migrate)
• Se crean nuevas migraciones con
./script/generate migration NombreMigracion
Migraciones
• Expresa
Comentarios de: Ruby on Rails avanzado (0)
No hay comentarios