Snellire il codice

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

def acronym_page
@page=Page.find(params[:id])
@[email protected](/ PPC /," <acronym
title=#{34.chr}Pocket PC#{34.chr}>PPC “)
@[email protected](/ 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])
@[email protected](/ PPC /," <acronym
title=#{34.chr}Pocket PC#{34.chr}>PPC “)
@[email protected](/ 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

Metti la parola da sostituire come chiave in un hash, con il testo
sostitutivo come valore, e itera su quello :slight_smile:
Il giorno 05/feb/2013, alle ore 00:35, Luigi M.
[email protected] ha scritto:

Mi sono divertito un po’ :slight_smile:

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/
)

Chiedi pure se hai domande, ciao!

Ju

–*
*M.Sc. Ju Liu
Card: http://zerp.ly/ju-liu

Societ Cooperativa weLaika - Impresa Sociale
Corso Vigevano 14/B, 10154 Torino (TO), Italy
http://welaika.com - [email protected]

2013/2/5 Sante Gennaro R. [email protected]

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.

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

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.
[email protected] ha scritto:


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml

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

Il giorno 06/feb/2013, alle ore 23:54, Luigi M.
[email protected] 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
:stuck_out_tongue:

Vorrei far presente che la mia web app (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 :wink:

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

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

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

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.

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