# Yesno (la prima gemma non si scorda mai)

**URL:** <https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041>\
**Category:** IT\
**Created:** [January 23, 2012, 4:03pm UTC](https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041 "2012-01-23T16:03:06Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![dubstep](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/cdc98d/32.png) [@dubstep](https://www.ruby-forum.com/u/dubstep)\
**Post date:** [January 23, 2012, 4:03pm UTC](https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041/1 "2012-01-23T16:03:06Z")

</div>

Ciao a tutti,

Ho creato la mia prima gemma e volevo un parere dai piu`esperti e se c'era qualche "paziente" che avesse voglia di testarlo su i rails piu`  
vecchi.

la gemma si chiama “yesno” e si occupa di trasformare i valori booleani  
in stringhe es: si/no, vero/false, maschio/femmina ecc.  
La trasformazione avviene sfruttando I18n.

es:  
@person.sex = true  
yesno(“mf”, @person.sex) -\> “maschio”

@article.switch = false  
yesno(“act”, @article.switch) -\> “inattivo”

in sintesi il tutto si riduce a questa funzione:

def yes\_no(type, to\_validate)  
return to\_validate ? I18n.t(“yesno.#{type}.t”) :  
I18n.t(“yesno.#{type}.f”)  
end

Piu`i file yesno.lingua.yml che contengono la scala delle risposte

it:  
yesno:  
tf:  
t: “vero”  
f: “falso”  
yn:  
t: “si”  
f: “no”  
mf:  
t: “maschio”  
f: “femmina”  
ecc…

Ovviamente non e`niente di rivoluzionario ma e` un helper che mi  
portavo sempre appresso, avevo voglia di provare a creare una gemma e  
magari puo` fare comodo a qualcuno…

Grazie a tutti  
Andrea

P.S.  
per installarlo:

# gem install yesno

# rails g yesno:install

---

<div class="post-metadata">

**Author:** ![reis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/f1d935/32.png) [@reis](https://www.ruby-forum.com/u/reis)\
**Post date:** [January 24, 2012, 9:26am UTC](https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041/2 "2012-01-24T09:26:44Z")

</div>

Ciao Andrea,

secondo me dovresti dargli qualcosa in più ad esempio potresti pensare  
di ampliarlo anche alla pluralizzazione con i18n:

def pluralize\_yn(collection, type)  
pluralize(collection.size, I18n.t(“yesno.#{type}.s”),  
I18n.t(“yesno.#{type}.p”))  
end

it:  
yesno:  
ciuffi:  
s: “ciuffolo”  
p: “ciuffoli”

Sono piccole cosette che generalmente si fanno internamente al progetto  
ma se diventano tante potrebbe avere il suo perchè.

---

<div class="post-metadata">

**Author:** ![reis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/f1d935/32.png) [@reis](https://www.ruby-forum.com/u/reis)\
**Post date:** [January 24, 2012, 6:13pm UTC](https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041/3 "2012-01-24T18:13:07Z")

</div>

E` un buon consiglio, ci lavorero` subito.  
Potrei aggiungere un opzione pluralize =\> true e modificare l’yml in

it:  
yesno:  
act:  
ts: attivo  
tp: attivi  
fs: inattivo  
fp: inattivi

Prima voglio ridare un’occhiata alle api I18n e verificare quale e` il modo piu` pulito.

Andrea

Marco M. wrote in post #1042248:

> Ciao Andrea,
> 
> secondo me dovresti dargli qualcosa in più ad esempio potresti pensare  
> di ampliarlo anche alla pluralizzazione con i18n:
> 
> def pluralize\_yn(collection, type)  
> pluralize(collection.size, I18n.t(“yesno.#{type}.s”),  
> I18n.t(“yesno.#{type}.p”))  
> end
> 
> it:  
> yesno:  
> ciuffi:  
> s: “ciuffolo”  
> p: “ciuffoli”
> 
> Sono piccole cosette che generalmente si fanno internamente al progetto  
> ma se diventano tante potrebbe avere il suo perchè.

---

<div class="post-metadata">

**Author:** ![reis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/f1d935/32.png) [@reis](https://www.ruby-forum.com/u/reis)\
**Post date:** [January 25, 2012, 10:50pm UTC](https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041/4 "2012-01-25T22:50:19Z")

</div>

Aggiungendo il maschile ed il femminile si arriva ad otto possibili  
declinazioni per ogni tipo di booleano, alias tre if per ogni utilizzo  
se maschile  
se plurale  
se vero

Probabilmente dovrei cambiare approccio e fare una classe strutturata…

yesno(tipo, variabile).pluralize.femminalize

Anche se perderei l’occasione di fare il monorigone 😃

def yes\_no(type, to\_validate, pluralize=false, femminalize=false)  
return femminalize ? pluralize ? to\_validate ?  
I18n.t(“yesno.#{type}.fpt”) : I18n.t(“yesno.#{type}.fpf”) : to\_validate  
? I18n.t(“yesno.#{type}.fst”) : I18n.t(“yesno.#{type}.fsf”) :  
to\_validate ? I18n.t(“yesno.#{type}.mpt”) : 18n.t(“yesno.#{type}.mpf”) :  
to\_validate ? I18n.t(“yesno.#{type}.mst”) : I18n.t(“yesno.#{type}.msf”)  
end

---

<div class="post-metadata">

**Author:** ![reis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/f1d935/32.png) [@reis](https://www.ruby-forum.com/u/reis)\
**Post date:** [January 27, 2012, 10:55am UTC](https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041/5 "2012-01-27T10:55:15Z")

</div>

Mi ha convinto per le opzioni!  
Ho modificato la classe in questo modo:

def yesno(to\_validate, options = {})  
defaults = {  
:type =\> “default”,  
:pluralize =\> false,  
:female =\> false  
}  
options = defaults.merge(options)  
if options[:pluralize] == false  
if options[:female] == false  
return to\_validate ? I18n.t(“yesno.#{options[:type]}.smt”) :  
I18n.t(“yesno.#{options[:type]}.smf”)  
else  
return to\_validate ? I18n.t(“yesno.#{options[:type]}.sft”) :  
I18n.t(“yesno.#{options[:type]}.sff”)  
end  
else  
if options[:female] == false  
return to\_validate ? I18n.t(“yesno.#{options[:type]}.pmt”) :  
I18n.t(“yesno.#{options[:type]}.pmf”)  
else  
return to\_validate ? I18n.t(“yesno.#{options[:type]}.pft”) :  
I18n.t(“yesno.#{options[:type]}.pff”)  
end  
end  
end

Poi visto che mi rimaneva l’ansia dei quattro if (le tre opzioni piu` il  
test per la risposta) ne ho creata anche una fast in cui le impostazioni  
si passano, in caso, manualmente tramite stringa.

def fyesno(to\_validate, type = “default”, options = “sm”)  
return to\_validate ? I18n.t(“yesno.#{type}.#{options}t”) :  
I18n.t(“yesno.#{type}.#{options}f”)  
end

in questo modo non fai altro che passargli la strada verso la risposta.

Grazie per i suggerimenti  
Andrea

P.S.

Nelle opzioni ho perso mezzora a cercare di capire perche`me ne accettava tre e non quattro. Poi mi sono accorto che mi ero dimenticato un else...... Anche oggi il computer ha certificato la mia stupidita`.

Andrea

---

<div class="post-metadata">

**Author:** ![reis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/f1d935/32.png) [@reis](https://www.ruby-forum.com/u/reis)\
**Post date:** [January 26, 2012, 9:03am UTC](https://www.ruby-forum.com/t/yesno-la-prima-gemma-non-si-scorda-mai/216041/6 "2012-01-26T09:03:31Z")

</div>

I metodi sono fighi ma trovo che i parametri siano più funzionali ma ti  
consiglierei di usare un unico hash che migliora la comprensione del  
codice ed agevola gli utilizzatori:

def yes\_no(options={})  
return unless options[:type]  
#imposti i tuoi valori di default  
options = {:pluralize =\> nil, :femminalize =\> nil}.merge(options)  
…  
end

yes\_no :type =\> “mf”  
yes\_no :type =\> “mf”, :to\_validate =\> true, :pluralize =\> true

A proposito del monorigone: auguri! 🙂
