Validações personalizadas de trilhos
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_with
mé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.