# Snellire il codice

**URL:** <https://www.ruby-forum.com/t/snellire-il-codice/229794>\
**Category:** IT\
**Created:** [February 5, 2013, 12:35am UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794 "2013-02-05T00:35:58Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 5, 2013, 12:35am UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/1 "2013-02-05T00:35:58Z")

</div>

Salve a tutti,  
non riesco a capire come snellire il seguente codice:

def acronym\_page  
@page=Page.find(params[:id])  
@page.description=@page.description.gsub(/ PPC /," \<acronym  
title=#{34.chr}Pocket PC#{34.chr}\>PPC “)  
@page.description=@page.description.gsub(/ DVD /,” \<acronym  
title=#{34.chr}Digital Versatile Disc#{34.chr}\>DVD ")  
if @page.save  
flash[:notice] = ‘Acronimi sostituiti.’  
redirect\_to :action=\>‘modpag’,:id=\>@page  
end  
end

def acronym\_image  
@picture=Picture.find(params[:id])  
@picture.text=@picture.text.gsub(/ PPC /," \<acronym  
title=#{34.chr}Pocket PC#{34.chr}\>PPC “)  
@picture.text=@picture.text.gsub(/ DVD /,” \<acronym  
title=#{34.chr}Digital Versatile Disc#{34.chr}\>DVD ")  
if @picture.save  
flash[:notice]=‘Acronimi sostituiti.’  
redirect\_to :action=\>‘modpict’,:id=\>@picture.guide.id  
end  
end

ho riportato solo due delle sostituzioni che mi servono e cioé PPC e DVD  
ma ce ne sono più di venti.

Non riesco a capire come e dove scrivere una subroutine alla quale  
passare la tabella e la riga da modificare.

Nella tabella @page devo modificare la riga description mentre nella  
tabella @picture la riga text.

Grazie mille per l’aiuto

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 5, 2013, 12:47am UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/2 "2013-02-05T00:47:03Z")

</div>

Metti la parola da sostituire come chiave in un hash, con il testo  
sostitutivo come valore, e itera su quello 🙂  
Il giorno 05/feb/2013, alle ore 00:35, Luigi M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 5, 2013, 1:12am UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/3 "2013-02-05T01:12:46Z")

</div>

Mi sono divertito un po’ 🙂

> <https://gist.github.com/Arkham/4710943>

Oppure in console:

> irb(main):003:0\> AcronymSolver.new(" PPC DVD PPC ").solve!  
> =\> " \<acronym title="Pocket PC"\>PPC \<acronym title="Digital  
> Versatile Disc"\>DVD \<acronym title="Pocket PC"\>PPC "

In pratica, la classe AcronymSolver si occupa solo di fare queste  
sostituzioni di acronimi; la puoi spostare in /lib e usare un po’  
dappertutto. L’unico pezzo un po’ pi incasinato questo gsub:

text.gsub!(/ #{acronym} /, %[#{acronym}])

in pratica, con l’operatore % puoi creare delle stringhe quotate senza  
dover fare l’escape del double-quote (cfr.  
[http://teohm.github.com/blog/2012/10/15/start-using-ruby-percent-notation/](http://teohm.github.com/blog/2012/10/15/start-using-ruby-percent-notation/)  
)

Chiedi pure se hai domande, ciao!

```
Ju

```

## –\* \*M.Sc. Ju Liu Card: [http://zerp.ly/ju-liu](http://zerp.ly/ju-liu)

Societ Cooperativa weLaika - Impresa Sociale  
Corso Vigevano 14/B, 10154 Torino (TO), Italy  
[http://welaika.com](http://welaika.com) - [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

2013/2/5 Sante Gennaro R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 5, 2013, 2:12pm UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/4 "2013-02-05T14:12:31Z")

</div>

Ragazzi, perdonatemi ma non ho capito come utilizzare entrambe le  
soluzioni.

Mi dite un pò più nello specifico dove, nell’applicazione web, scrivere  
e cosa.

Grazie infinite.

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 5, 2013, 3:24pm UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/5 "2013-02-05T15:24:47Z")

</div>

puoi prendere la classe di Ju e fare delle prove in un file (oppure la  
incolli dentro Pry), infine la usi passando una stringa 😉

AcronymSolver.new(“un testo a piacere che contenga DVD o PPC”).solve!

nei vari codici postati, ci sono due metodi #acronym\_page e  
#acronym\_image che in realt andrebbero messi in un ipotetico controller  
di rails (assieme a vari model e views).

tuttavia non ti conviene: se vuoi giocherellare con il codice, puoi  
partire dalla classe che ha creato Ju e incollarla in un file prova.rb  
(nome di fantasia) ed eseguirlo in shell con:

ruby prova.rb

ciao,  
A.

Il giorno 05/feb/2013, alle ore 14:12, Luigi M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> * * *
> 
> Ml mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
[http://andreapavoni.com](http://andreapavoni.com)

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 6, 2013, 11:54pm UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/6 "2013-02-06T23:54:44Z")

</div>

Vi ringrazio ancora per il tempo che mi state dedicando ma, purtroppo,  
per mia incompetenza non riesco a capire la vostra soluzione in  
particolare non ho capito come poter utilizzare la soluzione di Ju.

Vorrei far presente che la mia web app ([software-windows.net](http://software-windows.net)) gira su  
ruby 1.8.6 e rails 2.0.2.

Vorrei però darvi qualche altro dettaglio sulla soluzione che ho trovato  
io:

i due metodi acronym\_page e acronym\_image sono sempre stati nel  
controller admin\_controller.rb e funzionano perfettamente scritti nel  
modo in cui li ho riportati nel post di apertura.

Nel tentativo di creare una subroutine comune ho scritto in  
application.rb il seguente codice:

def sostituzione\_abbr(item)  
item.description=item.description.gsub(/ PPC /," \<acronym  
title=#{34.chr}Pocket PC#{34.chr}\>PPC ")  
…  
end

che funziona perfettamente richiamata da admin\_controller.rb così:

def acronym\_page  
@page=Page.find(params[:id])  
sostituzione\_abbr(@page)  
if @page.save  
flash[:notice]=‘Acronimi sostituiti.’  
redirect\_to :action=\>‘modifica’,:id=\>@page  
end  
end

il problema a questo punto è che in application.rb devo, per far  
funzionare la subroutine, necessariamente agganciare direttamente la  
“colonna” description con il comando item.description.

Scrivo: “necessariamente” perché se la passo direttamente come variabile  
attraverso la chiamata:  
sostituzione\_abbr(@page.description)  
non funziona!  
Se funzionasse avrei risolto tutti i miei problemi perché potrei  
richiamare in ogni metodo la subroutine in questione sotituendo la  
variabile con quella che voglio elaborare.

Grazie ancora per l’aiuto.

Luigi

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 7, 2013, 11:56am UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/7 "2013-02-07T11:56:05Z")

</div>

Il giorno 06/feb/2013, alle ore 23:54, Luigi M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> Vi ringrazio ancora per il tempo che mi state dedicando ma, purtroppo,  
> per mia incompetenza non riesco a capire la vostra soluzione in  
> particolare non ho capito come poter utilizzare la soluzione di Ju.

mi permetto di consigliarti che, magari, il caso di studiare ruby un  
po’ di pi, almeno per riuscire a capire/usare quelle 20 righe di codice  
😛

> Vorrei far presente che la mia web app ([software-windows.net](http://software-windows.net)) gira su  
> ruby 1.8.6 e rails 2.0.2.

sono versioni molto datate (~2007) e non pi supportate, probabile che  
molti consigli/guide/gemme non possono essere applicati :-/

ovviamente non il caso degli acronimi, per giusto per avvisarti 😉

> Nel tentativo di creare una subroutine comune ho scritto in  
> application.rb il seguente codice:

attenzione: specifica il percorso completo, perch “application.rb”  
troppo ambiguo, ti trovi in config/ o in app/controllers/ ? presumo sia  
app/controllers/ perch prima di rails3, se non ricordo male, si chiamava  
application.rb anzich application\_controller.rb 😛

> def acronym\_page  
> @page=Page.find(params[:id])  
> sostituzione\_abbr(@page)  
> if @page.save  
> flash[:notice]=‘Acronimi sostituiti.’  
> redirect\_to :action=\>‘modifica’,:id=\>@page  
> end  
> end

ho capito che hai bisogno di sostituire gli acronimi con la loro  
descrizione, tuttavia, per curiosit, ti chiedo come mai hai una action  
nel controller che applica la sostituzione e salva la pagina 😮

mi viene da pensare che sia un’operazione una-tantum (dopo la prima  
volta, gli acronimi sono gi sostituiti e salvati su db). forse ti  
conveniva scrivere un task Rake o farlo a manina dalla console di rails.

> il problema a questo punto che in application.rb devo, per far  
> funzionare la subroutine, necessariamente agganciare direttamente la  
> “colonna” description con il comando item.description.
> 
> Scrivo: “necessariamente” perch se la passo direttamente come variabile  
> attraverso la chiamata:  
> sostituzione\_abbr(@page.description)  
> non funziona!

non funziona perch se passi il “valore” di @page.description non vai a  
modificare la colonna di @page, ma solo la stringa ‘as-is’.

in alternativa, puoi fare qualcosa del genere:

def sostituzione\_abbr(text)  
text.gsub(/ PPC /," \<acronym title=#{34.chr}Pocket  
PC#{34.chr}\>PPC ")  
.  
return text  
end

def acronym\_page  
@page=Page.find(params[:id])  
@page.description = sostituzione\_abbr(@page.description)  
…  
end

abbastanza brutto da scrivere e sicuramente si possono adottare  
soluzioni pi pulite, ma dovrebbe funzionare 😉

> Se funzionasse avrei risolto tutti i miei problemi perch potrei  
> richiamare in ogni metodo la subroutine in questione sotituendo la  
> variabile con quella che voglio elaborare.

che vuoi sostituire gli acronimi chiarissimo, non chiaro come/quando  
vuoi farlo: modificare articoli esistenti? dopo la creazione? in  
fruizione?

ciao,  
A.

–  
[http://andreapavoni.com](http://andreapavoni.com)

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 7, 2013, 10:03pm UTC](https://www.ruby-forum.com/t/snellire-il-codice/229794/8 "2013-02-07T22:03:34Z")

</div>

Grazie mille per la risposta e per il consiglio purtroppo ho poco tempo  
per studiare (lavoro).

L’applicazione è vecchia e sul server è anche freezata però l’ho scritta  
tutta da zero e senza alcuna gemma, ci sono affezionato…scherzi a  
parte mi piacerebbe aggiornarla ma mi manca il tempo per farlo.

L’operazione che eseguo è una tantum e manuale e dopo il caricamento nel  
db per questo non l’ho automatizzata.

La soluzione del return text mi ha fatto capire qualcosina in più a  
proposito delle modiche as-is ed ero convinto che potesse funzionare ma  
purtroppo non funziona.

application.rb è nella cartella controller.

Grazie mille

Luigi
