Validações personalizadas de trilhos

Abr 20, 2021
admin

Deixe-nos considerar uma exigência e então entender a necessidade de cada um, ou qualquer um destes:

Deixe-nos considerar que temos um modelo Item, com nome de tabela como items , onde cada registro representa um pacote com atributos como title, description ,width, height, depth, e weight.

Cada item deve obedecer as seguintes regras:

  • Queremos que o título tenha um comprimento mínimo de 10 caracteres, e cada título deve conter uma palavra-chave i.e. great-article .
  • O volume do item deve estar entre 20 e 3000 metros cúbicos (ou seja Validação do volume)
  • A compacidade do item não pode exceder 200 gramas por metro cúbico (ou seja, Compactness Validation)
  • Nenhum comprimento lateral pode ser inferior a 15% do maior lado (ou seja, validação da proporção).

Agora vamos pegar a primeira regra, com a primeira abordagem

  • Utilizar um método personalizado para realizar a validação.

Usamos a primeira abordagem para validação personalizada, ou seja, definir um método de validação dentro da classe do modelo.

Funciona bem, mas também adiciona mais lógica ao modelo. É preferível extrair a lógica em uma classe helper separada sempre que possível. Isso porque, toda a lógica para uma validação em particular é encapsulada ao seu próprio objeto, facilitando a depuração.

Validemos a densidade usando a segunda abordagem, ou seja, criando uma classe helper validator. O #validates_withmétodo fornecido pelos rails aponta a validação para uma classe helper:

class Item < ActiveRecord::Base

validates_with CompactnessValidator

end

Agora precisamos criar uma classe helper CompactnessValidator

No diretório /models/concerns, crie “compactness_validator.rb”. O CompactnessValidator herda de ActiveModel::Validator, cuja propriedade está lá para haver um método chamado #validate. Este método pode acessar todo o registro. E pode aplicar erros ao registro se necessário.

class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end

Note, aqui podemos adicionar n-número de validações nesta mesma classe para vários atributos. Por exemplo, podemos até adicionar validação para título nesta classe.

para exemplo.

Agora vamos usar a terceira abordagem de definir validações personalizadas.

Criando um validador helper personalizado, podemos usá-lo diretamente como os rails embutidos, apenas dizendo, “item_dimensions_proportion:true”.

class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end

Agora como definimos item_dimensions_proportion flag como true, os rails agora esperam ter uma classe helper para validação chamada ItemDimensionsProportionValidator. Então no diretório de modelos diz respeito criar um arquivo “item_dimensions_proportion_validator.rb”.

Temos que definir um método #validates_each para facilitar a validação. Ele irá pegar cada atributo, e irá verificar o valor de acordo com a lógica escrita no método validate_each.

Usar validadores personalizados é um ótimo, se você quiser extrair a validação relacionada ao código para uma classe separada. É realmente útil para depurar também, pois todo o código de validação de um modelo está em um só lugar. Também podemos até usar os mesmos validadores para várias classes, o que o torna realmente útil e fantástico.

Execute estes validadores personalizados nas suas aplicações, e diga-me se isto o ajudou de uma forma positiva. Também pode contactar-me em caso de qualquer problema @ [email protected].

Eu também gostaria de aumentar o meu número de leitores, por isso, peço-lhe que o partilhe com os seus amigos, colegas, etc, se achar este blog útil.

Alementos.

Deixe uma resposta

O seu endereço de email não será publicado.