Skip to content
janeiro 21, 2009 / cassiomarques

Nova versão da gem brcpfcnpj

Update: Se alguém ainda estiver tendo problemas com o brcpfcnpj, atualizem o Brazilian-Rails para versão 2.1.1 ou superior que os problemas citados nos comentários abaixo foram solucionados.

Há um tempo atrás descobrimos que a gem brcpfcnpj, parte integrante do projeto brazilian-rails, tinha um pequeno problema para trabalhar em conjunto com as validações do Rails. Por padrão, qualquer atributo usado com usar_como_cpf ou usar_como_cnpj passava a ser automaticamente validado quanto ao seu formato (além da validação do conteúdo do número de documento em questão). Entretanto, não há validação automática para garantir esses atributos não são vazios ou que devem ser sempre únicos.

A solução mais óbvia seria simplesmente escrever código como estes:

class Cliente < ActiveRecord::Base usar_como_cpf :cpf validates_presence_of :cpf validates_uniqueness_of :cpf end [/source] [source language="ruby"] class Empresa < ActiveRecord::Base usar_como_cnpj :cnpj validates_presence_of :cnpj validates_uniqueness_of :cnpj end [/source] O problema disso é que até o Rails 2.1, se você usasse os códigos acima, a coisa não funcionaria direito. Isso porque por baixo dos panos o brcpfcnpj utiliza estruturas do tipo composed_of e esse tipo de construção não trabalhava bem com as macros de validação do Rails. Mais precisamente, se você tentasse usar um validates_uniqueness_of junto com um usar_como_cpf, todo o objeto da classe Cpf seria convertido para uma string (usando to_s, ou seja, não o que queremos) e o resultado disso seria colocado na cláusula where da query SQL feita no banco. Resumindo: Não retornava nada e mesmo que o seu cpf ou cnpj já estivessem gravados no banco, seu objeto continuaria válido.

A partir do Rails 2.2 isso mudou, pois foi alterada a forma com que o composed_of trabalha (e eu me aproveitei deste fato). A partir de agora, caso esteja utilizando o Rails 2.2 ou superior no seu projeto e estiver usando a gem brcpfcnpj, você pode escrever código como o descritos nos exemplos acima e tudo vai funcionar perfeitamente. Caso você ainda esteja no Rails 2.1 ou inferior, continua como antes: A gem irá validar perfeitamente o conteúdo do seu cpf ou cnpj, mas será necessário simular o comportamento das macros escrevendo validações na mão, caso você precise desse tipo de validação. Mais um incentivo para você atualizar o Rails nas suas aplicações.

Para baixar o brazilian-rails com a nova versão do brcpfcnpj, basta fazer

gem install brazilian-rails
cnpj, c

14 Comentários

Deixe um comentário
  1. cassiomarques / jan 21 2009 4:56 am

    Valeu Marcos :)

  2. herminio / fev 3 2009 12:04 am

    Cassio, da um help…
    eu tenho um model chamado customer, onde ele tem 3 atributos: nome, tipo, cpfcnpj todos string.
    ai no model eu tenho
    class Customer OPTIONS_FOR_TIPO
    end

    ai o que eu quero? é se o cara escolher o tipo fisica
    ele seta o atributo cpfcnpj.
    usar_como_cpf :cpfcnpj
    verifica se é um numero valido e salva, e isso seria a mesma coisa para a pessoa juridica
    se colocar na view juridica no model
    ele usa:
    usar_como_cnpj :cpfcnpj
    verifica se é um numero valido e salva.

    a minha view está:
    New customer

    poderia me ajudar? eu ja tentei usar com o before_filter no model e nada… :(

  3. Fernando / fev 4 2009 2:22 pm

    atualizei a gem mais ainda não está validando a presença, alguma dica?

  4. cassiomarques / fev 4 2009 2:28 pm

    Olá Fernando,

    1) A validação não ocorre de forma automática, você vai precisar declarar essa validação usando o helper validates_presence_of :seu_campo_para_cpf_ou_cnpj

    2) A utilização do validates_presence_of e validates_uniqueness_of funcionam somente a partir do Rails 2.2. Qual versão você está usando?

  5. Esdras Mayrink / fev 18 2009 4:17 am

    Ta funcionando não Cassio. No console ele executa o validates_presence_of, mas quando o objeto é criado pelo controller, ele não valida. Testei de todo o jeito, é só tirar o usar_como_cpf e as validações do AR voltam ao normal. To usando rails 2.2.2. Se tiver alguma dica, posta aew, obrgado.

  6. cassiomarques / fev 18 2009 6:54 am

    @Esdras,

    Encontrei um bug que fazia com que o validates_presence_of passasse quando o valor era uma string vazia. Falha minha, esqueci um caso de teste.

    Já alterei aqui e subi a nova versão. Atualiza sua instalação do Brazilian Rails para a versão 2.1.1 e tenta novamente que agora deve funcionar.

    Qualquer problema, por favor avise.

  7. Esdras Mayrink / fev 18 2009 7:30 am

    Ao estudar a implementação da gem percebi q ao validar o cpf, ou o cnpg somente os primeiros caracteres do atributo número são validados, isso permite q um usuário insira um cpf com os onze primeiros caracteres de um cpf já cadastrado (válido) seguido de outros caracteres (quaisquer, incluindo letras), aquela string será considerada um cpf válido. Isso não pode ser um problema pra validar a unicidade do atributo?

  8. Esdras Mayrink / fev 18 2009 8:02 am

    Opa… muito obrigado Cassio… já to atualizando … xD

  9. Esdras Mayrink / fev 18 2009 10:30 am

    Validates_presence_of :cpf ainda não funciona. Fiz um workaround pra poder as validações de presença, unicidade e do formato do cpf.

    def validate
    _cpf = Cpf.new(cpf)
    errors.add(:cpf, “inválido.”) unless _cpf.valido?
    self.cpf = _cpf.numero
    end

    Tem idéia do q pode ser?

    Mesmo tirando o “return false if @numero.empty?” não deu véi… xD …

    abraço… boa sorte na captura do inseto … xD

  10. cassiomarques / fev 18 2009 4:16 pm

    Pra quem ainda estiver tendo algum problema com o brcpfcnpj, atualizamos a versão no RubyForge e parece que agora está tudo ok. Atualizem a versão do Brazilian-Rails para >= 2.1.1

  11. Fernando / maio 6 2009 6:14 pm

    Olá Cassio,

    Estamos usando o brazilian_rails (2.1.8) como plugin (porque não podemos instalar gems no nosso dreamhost) e não conseguimos fazer funcionar o validates_uniqueness_of junto com o usar_como_cpf. Você tem alguma idéia? estamos usando o rails 2.2.2

    • cassiomarques / maio 6 2009 6:24 pm

      Olá Fernando,

      Qual erro vocês estão tendo? Ou simplesmente permite duplicar o cpf?
      Se possível, veja a query que está sendo feita nos logs, quando ele pesquisa se o cpf já existe.

      • Fernando / maio 8 2009 1:48 am

        olá cassio.

        desculpe, foi erro nosso mesmo. o que aconteceu foi que em nossas fixtures, colocamos o cpf sem formatação (11144477735), então de fato ele não encontrava, porque ele buscava o cpf com formatação, já que ele sempre insere no banco de dados com a formatação (111.444.777-35). por isso o nosso teste que verificava que ele não deveria inserir o cpf repetido falhava. corrigi os fixtures e agora nosso testes estão passando.

        valeu!

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: