Forum: Italian Ruby user group Snellire il codice

Posted by Luigi Maresca (luigi-s-w-net)
on 2013-02-05 00:35
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</acronym> ")
@page.description=@page.description.gsub(/ DVD /," <acronym
title=#{34.chr}Digital Versatile Disc#{34.chr}>DVD</acronym> ")
  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</acronym> ")
@picture.text=@picture.text.gsub(/ DVD /," <acronym
title=#{34.chr}Digital Versatile Disc#{34.chr}>DVD</acronym> ")
  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
Posted by Sante Gennaro Rotondi (Guest)
on 2013-02-05 00:47
(Received via mailing list)
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 Maresca 
<marluigi@libero.it> ha scritto:
Posted by Ju Liu (Guest)
on 2013-02-05 01:12
(Received via mailing list)
Mi sono divertito un po' :)

https://gist.github.com/4710943

Oppure in console:

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

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
title="#{solution}">#{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-usin... 
)

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 - info@welaika.com


2013/2/5 Sante Gennaro Rotondi <saten.r@gmail.com>
Posted by Luigi Maresca (luigi-s-w-net)
on 2013-02-05 14:12
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.
Posted by Andrea Pavoni (apeacox)
on 2013-02-05 15:24
(Received via mailing list)
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 Maresca 
<marluigi@libero.it> ha scritto:

> _______________________________________________
> Ml mailing list
> Ml@lists.ruby-it.org
> http://lists.ruby-it.org/mailman/listinfo/ml

--
http://andreapavoni.com
Posted by Luigi Maresca (luigi-s-w-net)
on 2013-02-06 23:54
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</acronym> ")
....
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
Posted by Andrea Pavoni (apeacox)
on 2013-02-07 11:56
(Received via mailing list)
Il giorno 06/feb/2013, alle ore 23:54, Luigi Maresca 
<marluigi@libero.it> 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 
:P


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

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


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

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</acronym> ")
  .
  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
Posted by Luigi Maresca (luigi-s-w-net)
on 2013-02-07 22:03
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
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.