# Riutilizzo delle validazioni

**URL:** <https://www.ruby-forum.com/t/riutilizzo-delle-validazioni/182597>\
**Category:** IT\
**Created:** [January 30, 2010, 7:27pm UTC](https://www.ruby-forum.com/t/riutilizzo-delle-validazioni/182597 "2010-01-30T19:27:42Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![pezzuya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/eada6e/32.png) [@pezzuya](https://www.ruby-forum.com/u/pezzuya)\
**Post date:** [January 30, 2010, 7:27pm UTC](https://www.ruby-forum.com/t/riutilizzo-delle-validazioni/182597/1 "2010-01-30T19:27:42Z")

</div>

Ciao a tutti.  
Vista la mia poca conoscenza di rails mi trovo sempre piÃ¹ spesso a dover  
fare operazioni di copia e incolla per fare le stesse validazioni (ad  
esempio sul formato di indirizzi mail, numeri di telefono ecc) su  
modelli diversi (cosa poco pratica e poco furba).  
Quindi mi domandavo come (sicuramente ci deve essere un modo) Ã©  
possibile creare un “contenitore di validazioni” per le validazioni piÃ¹  
comuni e usarle “al bisogno” all’interno dei singoli modelli.  
Avevo pensato di usare l’ereditarietÃ creando una classe  
“ValidationsContainer” che eredita da “ActiveRecord” (Class  
ValidationsContainer \< ActiveRecord).  
All’interno di “ValidationsContainer” definisco le mie validazioni “piÃ¹  
comuni” tipo:

def valid\_email?  
…  
end

Poi faccio in modo che ogni modello che deve usare le validazioni di  
“ValidationsContainer” erediti da quest’ultimo xes.

Class User \< ValidationsContainer

A questo punto all’interno di User richiamando:

validate\_valid\_email? :email, :message =\> “L’email inserita non ha un  
formato valido”

Dovrei poter “riusare” la validazione precedentemente creata…

Questo descritto Ã© il giusto modo di procedere? O c’Ã¨ un modo piÃ¹  
corretto?

Un grazie anticipato a tutte le persone che mi aiuteranno.

Ciao

---

<div class="post-metadata">

**Author:** ![pezzuya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/eada6e/32.png) [@pezzuya](https://www.ruby-forum.com/u/pezzuya)\
**Post date:** [January 31, 2010, 10:28am UTC](https://www.ruby-forum.com/t/riutilizzo-delle-validazioni/182597/2 "2010-01-31T10:28:31Z")

</div>

Le validazioni sono definite nel modulo Validations contenuto nel modulo  
ActiveRecord, per cui potresti mettere nella lib delle tue applicazioni  
un file validations\_ext.rb fatto cosÃ¬:

module ActiveRecord  
module Validations

```
def validates_email
  validates_format_of :email, :with => 

```

/\A([^@\s]+)@((?:[-a-z0-9]+.)+  
[a-z]{2,})\Z/i, :message =\> “L’email inserita non ha un formato valido”  
end

end  
end

Alle fine di config/environment.rb aggiungi require “validations\_ext” e  
nel modello scrivi semplicemente

validates\_email

Non l’ho testato ma dovrebbe funzionare. In questo modo non hai bisogno  
di far derivare i modelli da classi diverse dal solito ActiveRecord e  
non dovrai modificare i modelli giÃ esistenti, salvo inserire le tue  
validazioni.

Lascio a te trovare il modo di passare argomenti a validates\_email.  
Magari guarda come fa active record nel suo file  
lib/active\_record/validations.rb

Paolo

pezzuya .. wrote:

> Ciao a tutti.  
> Vista la mia poca conoscenza di rails mi trovo sempre piÃ¹ spesso a dover  
> fare operazioni di copia e incolla per fare le stesse validazioni (ad  
> esempio sul formato di indirizzi mail, numeri di telefono ecc) su  
> modelli diversi (cosa poco pratica e poco furba).  
> Quindi mi domandavo come (sicuramente ci deve essere un modo) Ã©  
> possibile creare un “contenitore di validazioni” per le validazioni piÃ¹  
> comuni e usarle “al bisogno” all’interno dei singoli modelli.  
> Avevo pensato di usare l’ereditarietÃ creando una classe  
> “ValidationsContainer” che eredita da “ActiveRecord” (Class  
> ValidationsContainer \< ActiveRecord).  
> All’interno di “ValidationsContainer” definisco le mie validazioni “piÃ¹  
> comuni” tipo:
> 
> def valid\_email?  
> …  
> end
> 
> Poi faccio in modo che ogni modello che deve usare le validazioni di  
> “ValidationsContainer” erediti da quest’ultimo xes.
> 
> Class User \< ValidationsContainer
> 
> A questo punto all’interno di User richiamando:
> 
> validate\_valid\_email? :email, :message =\> “L’email inserita non ha un  
> formato valido”
> 
> Dovrei poter “riusare” la validazione precedentemente creata…
> 
> Questo descritto Ã© il giusto modo di procedere? O c’Ã¨ un modo piÃ¹  
> corretto?
> 
> Un grazie anticipato a tutte le persone che mi aiuteranno.
> 
> Ciao

---

<div class="post-metadata">

**Author:** ![pezzuya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/eada6e/32.png) [@pezzuya](https://www.ruby-forum.com/u/pezzuya)\
**Post date:** [January 31, 2010, 12:23pm UTC](https://www.ruby-forum.com/t/riutilizzo-delle-validazioni/182597/3 "2010-01-31T12:23:17Z")

</div>

> Lascio a te trovare il modo di passare argomenti a validates\_email.  
> Magari guarda come fa active record nel suo file  
> lib/active\_record/validations.rb

Grazie Paolo.  
Non ho sott’occhio “validation.rb” ma, in teoria, se la validazione  
richiedesse degli argomenti non mi basterebbe passarglieli alla  
chiamata?

per esempio cosÃ¬:

validates\_email(argomento1, argomento2, …)

Alla fine una validazione dovrebbe essere come una semplicissima azione  
o mi sbaglio?

---

<div class="post-metadata">

**Author:** ![pezzuya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/eada6e/32.png) [@pezzuya](https://www.ruby-forum.com/u/pezzuya)\
**Post date:** [January 31, 2010, 2:09pm UTC](https://www.ruby-forum.com/t/riutilizzo-delle-validazioni/182597/4 "2010-01-31T14:09:20Z")

</div>

Il 31 gennaio 2010 12.23, pezzuya .. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> validates\_email(argomento1, argomento2, …)
> 
> Alla fine una validazione dovrebbe essere come una semplicissima azione  
> o mi sbaglio?

in validation.rb, i metodi di validazione si appoggiano a validates\_each

> **[ActiveRecord::Validations::ClassMethods](https://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002161)**

L’help riporta un esempio semplice:  
class Person \< ActiveRecord::Base  
validates\_each :first\_name, :last\_name do |record, attr, value|  
record.errors.add attr, ‘starts with z.’ if value[0] == ?z  
end  
end

Questo perché il metodo validates\_qualcosa viene chiamato durante la  
definizione della classe, ma la validazione deve avvenire in una fase  
successiva (di default è :on =\> :save, ma può essere :create o  
:update).

Sempre da validations.rb viene un esempio più concreto:

```
  def validates_format_of(*attr_names)
    configuration = { :on => :save, :with => nil }
    configuration.update(attr_names.extract_options!)

    raise(ArgumentError, "A regular expression must be supplied as

```

the :with option of the configuration hash") unless  
configuration[:with].is\_a?(Regexp)

```
    validates_each(attr_names, configuration) do |record, attr_name, 

```

value|  
unless value.to\_s =~ configuration[:with]  
record.errors.add(attr\_name, :invalid, :default =\>  
configuration[:message], :value =\> value)  
end  
end  
end

pietro
