Yesno (la prima gemma non si scorda mai)

Ciao a tutti,

Ho creato la mia prima gemma e volevo un parere dai piuesperti 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 eniente 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

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è.

Eun 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 eil 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è.

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 :smiley:

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

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 percheme 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

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! :slight_smile: