{"id":76,"date":"2009-08-17T12:01:44","date_gmt":"2009-08-17T15:01:44","guid":{"rendered":"http:\/\/blog.plataformatec.com.br\/?p=76"},"modified":"2009-08-19T05:27:20","modified_gmt":"2009-08-19T08:27:20","slug":"nao-sobrecarregue-seus-usuarios-com-validacoes","status":"publish","type":"post","link":"https:\/\/blog.plataformatec.com.br\/2009\/08\/nao-sobrecarregue-seus-usuarios-com-validacoes\/","title":{"rendered":"N\u00e3o sobrecarregue seus usu\u00e1rios com valida\u00e7\u00f5es"},"content":{"rendered":"
Uma das primeira coisas que aprendemos em Rails e que s\u00e3o de grande utilidade s\u00e3o as valida\u00e7\u00f5es do ActiveRecord<\/a>. Por\u00e9m, como as valida\u00e7\u00f5es s\u00e3o muito f\u00e1ceis de adicionar e remover, temos que ter certeza que n\u00e3o estamos sobrecarregando nossos usu\u00e1rios com valida\u00e7\u00f5es.<\/p>\n Por exemplo, supondo que estamos validando o CPF do usu\u00e1rio no cadastro e temos o seguinte c\u00f3digo:<\/p>\n Na configura\u00e7\u00e3o acima, se o usu\u00e1rio esquece de preencher o campo CPF, deixando-o em branco, nada menos que quatro erros aparecer\u00e3o para ele:<\/p>\n Se o usu\u00e1rio deixou apenas o campo em branco, porque mostrar todos esses erros para ele? Todos os erros mostrados s\u00e3o relevantes?<\/p>\n \u00d3 c\u00e9us! O que fiz de errado para aparecer tantos erros?<\/p><\/div>\n Felizmente, a solu\u00e7\u00e3o \u00e9 simples, apenas adicione :allow_blank<\/em> nas valida\u00e7\u00f5es que elas n\u00e3o ser\u00e3o calculadas caso o campo seja enviado vazio:<\/p>\n Voc\u00ea tamb\u00e9m pode usar o m\u00e9todo Object#with_options<\/strong> adicionado pelo Rails para agrupar as valida\u00e7\u00f5es:<\/p>\n O campo CPF \u00e9 apenas um exemplo, mas estamos sobrecarregando os nossos usu\u00e1rios frequentemente nos campos username, e-mail, password e outros.<\/p>\n Um outro t\u00f3pico que vale a pena ser discutido sobre valida\u00e7\u00f5es s\u00e3o campos de confirma\u00e7\u00e3o. Existe a seguinte nota na documenta\u00e7\u00e3o do Rails para validates_confirmation_of<\/em>:<\/p>\n E isso \u00e9 uma feature<\/strong>. Isso significa que nos seus testes ou ao criar um objeto no console, voc\u00ea n\u00e3o<\/strong> precisa passar o campo :password_confirmation<\/em>:<\/p>\n Se por acaso o teste falhar, \u00e9 porque voc\u00ea adicionou a valida\u00e7\u00e3o de presen\u00e7a para o campo :password_confirmation<\/em>, que \u00e9 desnecess\u00e1ria. Como o campo :password_confirmation<\/em> estar\u00e1 presente nas views, ele sempre ser\u00e1 enviado e portanto sempre ser\u00e1 checado, justamente onde \u00e9 necess\u00e1rio.<\/p>\n","protected":false},"excerpt":{"rendered":" Uma das primeira coisas que aprendemos em Rails e que s\u00e3o de grande utilidade s\u00e3o as valida\u00e7\u00f5es do ActiveRecord. Por\u00e9m, como as valida\u00e7\u00f5es s\u00e3o muito f\u00e1ceis de adicionar e remover, temos que ter certeza que n\u00e3o estamos sobrecarregando nossos usu\u00e1rios com valida\u00e7\u00f5es. Por exemplo, supondo que estamos validando o CPF do usu\u00e1rio no cadastro e … \u00bb<\/a><\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[3],"tags":[],"aioseo_notices":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/76"}],"collection":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/comments?post=76"}],"version-history":[{"count":46,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/76\/revisions"}],"predecessor-version":[{"id":126,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/76\/revisions\/126"}],"wp:attachment":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/media?parent=76"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/categories?post=76"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/tags?post=76"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}\r\nclass User < ActiveRecord::Base\r\n validates_presence_of :cpf\r\n validates_length_of :cpf, :is => 11\r\n validates_numericality_of :cpf\r\n validates_uniqueness_of :cpf\r\n validates_as_cpf :cpf # Checa se o c\u00e1lculo de d\u00edgitos \u00e9 correto\r\nend\r\n<\/pre>\n
\n
\r\nclass User < ActiveRecord::Base\r\n validates_presence_of :cpf\r\n validates_length_of :cpf, :is => 11, :allow_blank => true\r\n validates_numericality_of :cpf, :allow_blank => true\r\n validates_uniqueness_of :cpf, :allow_blank => true\r\n validates_as_cpf :cpf, :allow_blank => true\r\nend\r\n<\/pre>\n
\r\nclass User < ActiveRecord::Base\r\n validates_presence_of :cpf\r\n\r\n with_options :allow_blank => true do |v|\r\n v.validates_length_of :cpf, :is => 11\r\n v.validates_numericality_of :cpf\r\n v.validates_uniqueness_of :cpf\r\n v.validates_as_cpf :cpf\r\n end\r\nend\r\n<\/pre>\n
N\u00e3o exija a presen\u00e7a de campos confirma\u00e7\u00e3o<\/h3>\n
\r\nvalidates_confirmation_of :password\r\n# Nota: essa valida\u00e7\u00e3o ocorre apenas se o campo :password_confirmation n\u00e3o for nulo.\r\n<\/pre>\n
\r\nit \"should be valid with valid attributes\" do\r\n User.new(:password => \"123456\").should be_valid\r\nend\r\n<\/pre>\n