Skip to content
fevereiro 23, 2008 / cassiomarques

Criando suas próprias validações no Rails

Já tem algum tempo que venho estudando Ruby e Rails e a cada dia fico mais fascinado com ambos. É incrível como Ruby é expressiva e poderosa e como o Rails facilita diversas tarefas e torna todo o projeto bastante organizado.

O esquema de validações utilizado pelo ActiveRecord é muito poderoso e conta com diversos métodos pré-definidos que realmente ajudam muito na hora de validar nossos objetos. Entretanto, podem surgir casos onde as mesmas validações sejam aplicadas em diferentes classes modelo, provocando duplicação de código e ferindo um dos pontos base do Rails, o DRY – Don’t Repeat Yourself.

Considere o exemplo abaixo, onde um modelo Aluno possui um endereço de email

class Aluno < ActiveRecord::Base
  validates_format_of :email,
                      :with => /\A[\w\._%-]+@[\w\.-]+\.[a-zA-Z]{2,4}\z/,
                      :if => Proc.new { |u| !u.email.nil? && !u.email.blank? },
                      :message => "Formato de email incorreto"
end

Agora imagine que você possui também os modelos Professor e Funcionario. Ambos possuem um atributo “email”. Percebeu? Ambos irão precisar de uma validação para este campo. O que você faz? Claro, o bom e velho ctrl-C, ctrl-V… NÃO! Lembre-se: Don’t Repeat Yourself.Podemos criar nossos próprios métodos de validação e utilizá-los nos nossos models da mesma forma que os métodos de validação pré-definidos no ActiveRecord. Como Ruby possui open classes, podemos sobrescrever métodos ou adicionar funcionalidades às nossas classes a qualquer momento. Podemos então estender o módulo de validações do ActiveRecord em um arquivo específico, como demonstrado abaixo:

my_validations.rb

module ActiveRecord
  module Validations
    module ClassMethods

      def validates_email_format(value)
        validates_format_of value,
                            :with => /\A[\w\._%-]+@[\w\.-]+\.[a-zA-Z]{2,4}\z/,
                            :if => Proc.new { |u| !u.email.nil? && !u.email.blank? },
                            :message => "Formato de email incorreto"
      end
    end
  end
end

Podemos colocar este arquivo dentro do diretório lib da aplicação Rails. No arquivo environment.rb, adicione a linha

require 'my_validations'

e reinicie seu servidor HTTP (WEBrick, Mongrel). Agora você escrever algo realmente mais simples e usar essa validação em qualquer classe que desejar

class Aluno < ActiveRecord::Base validates_email_format :email end[/sourcecode]

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: