Salve ancora, nel mio controller di gestione e aggiornamento del DB ho la seguente stringa, nel modulo di invio dati al DB, in admin_controller: @guide.description=@guide.description.gsub(/à /,"à") @guide.description=@guide.description.gsub(/è/,"è") @guide.description=@guide.description.gsub(/ì/,"ì") @guide.description=@guide.description.gsub(/ò/,"ò") @guide.description=@guide.description.gsub(/ù/,"ù") @guide.description=@guide.description.gsub(/é/,"é") ... @guide.save al fine di sostituire tutti i caratteri special con i relativi tag html. (ho scritto "special" altrimenti il forum lo prende per spam) Dato che questa sostituzione la faccio per più campi del db vorrei scriverla una sola volta come subroutine per poi richiamarla all'occorrenza, una cosa del tipo: def special_chars(table,item) table.item=table.item.gsub(/à /,"à") table.item=table.item.gsub(/è/,"è") table.item=table.item.gsub(/ì/,"ì") table.item=table.item.gsub(/ò/,"ò") table.item=table.item.gsub(/ù/,"ù") table.item=table.item.gsub(/é/,"é") table.item=table.item.gsub(/ & /," & ") table.item=table.item.gsub(/>"/,">"") table.item=table.item.gsub(/"</,""<") table.item=table.item.gsub(/μ/,"μ") end Ho provato a scriverla sia in application_helper che admin_helper ma non funge, dove la devo inserire? Grazie mille
on 2009-12-18 09:13
on 2009-12-18 15:13
2009/12/18 Luigi Maresca <marluigi@libero.it>:
> Ho provato a scriverla sia in application_helper che admin_helper ma non
in application_helper dovrebbe andare. Comunque guardati
htmlentities[1] che fa quel che fai tu, ma (probabilmente) meglio e in
modo più generico :)
[1] http://htmlentities.rubyforge.org/
on 2009-12-18 15:36
Ciao,
prova ad usare il suggerimento riportato all'url
http://stackoverflow.com/questions/1649825/how-to-convert-with-ruby-accented-characters-in-html-special-entities
Devi installare le gemme htmlentities e unicode
# coding: utf-8
require 'rubygems'
require 'htmlentities'
require 'unicode'
$KCODE = 'UTF-8'
coder = HTMLEntities.new
string = "Scròfina"
puts coder.encode(string, :named)
Ciao,
FEj
On Fri, Dec 18, 2009 at 2:27 PM, Luigi Maresca <marluigi@libero.it>
wrote:
>
--
Emilio Frusciante
“Go and spread the free software. Happy hacking!” - RMS
on 2009-12-18 16:09
Vi ringrazio per le risposte,
ma dato che la stessa funzione mi serve per fare anche altro come:
@guide.description=@guide.description.gsub(/ PPC /," <acronym
title=#{34.chr}Pocket PC#{34.chr}>PPC</acronym> ")
avrei bisogno di sapere come farlo funzionare con una subroutine.
In application_helper.rb ho provato ma sembra non funzionare se la
subroutine è richiamata da un controller, funge se invece è chiamata da
una view.
Aiuto!
Grazie
on 2009-12-18 19:31
Luigi Maresca wrote: > > Vi ringrazio per le risposte, > ma dato che la stessa funzione mi serve per fare anche altro come: > > @guide.description=@guide.description.gsub(/ PPC /," <acronym > title=#{34.chr}Pocket PC#{34.chr}>PPC</acronym> ") > > avrei bisogno di sapere come farlo funzionare con una subroutine. > > In application_helper.rb ho provato ma sembra non funzionare se la > subroutine è richiamata da un controller, funge se invece è chiamata da > una view. > > Aiuto! > > Grazie Può darsi che il problema che stai cercando di risolvere sia del tutto diverso, ma casomai fosse la consueta trasformazione di caratteri non ASCII in html entities per prevenire problemi di encoding, potrebbe essere più semplice forzare il browser su un charset (ad esempio utf8) inserendo <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> nel layout di ogni pagina html. In questo modo tutti gli input e tutti gli output saranno in utf8 e non ci sarà bisogno di convertire stringhe in html entities né in un senso né nell'altro. Il db deve essere creato in utf8 pure lui. Paolo
on 2009-12-19 00:36
Veramente già uso la definizione charset... il mio problema è un pò più generico infatti ho bisogno di risolverlo non tanto per i caratteri speciali ma quanto per la sostituzione degli acronimi che nulla hanno a che vedere con i charset. La soluzione vale per entrambe le sostituzione. Io nel mio controller di gestione e aggiornamento del DB ho una valanga di codice di troppo e poco gestibile che devo poter riassumere con una subroutine. In allegato un esempio del problema e una parte del controller di cui parlo, gisuto per farvi rendere conto.
on 2009-12-22 11:35
Luigi Maresca wrote: > Veramente già uso la definizione charset... il mio problema è un pò più > generico infatti ho bisogno di risolverlo non tanto per i caratteri > speciali ma quanto per la sostituzione degli acronimi che nulla hanno a > che vedere con i charset. > > La soluzione vale per entrambe le sostituzione. > > Io nel mio controller di gestione e aggiornamento del DB ho una valanga > di codice di troppo e poco gestibile che devo poter riassumere con una > subroutine. > > In allegato un esempio del problema e una parte del controller di cui > parlo, gisuto per farvi rendere conto. Luigi, intanto un'istruzione come " PPC ".gsub(/ PPC /, " <acronym title=#{34.chr}Pocket PC#{34.chr}>PPC</acronym> ") si può scrivere più succintamente e più leggibilmente come " PPC ".gsub(/ PPC /, %( <acronym title="Pocket PC">PPC</acronym> )) %() sono spesso d'aiuto Dopo di che, se @guide è un'istanza della class Guide potresti creare un metodo Guide#expand_acronyms! (passami il nome) che fa un loop su un array i cui elementi sono del tipo ["PPC", "Pocket PC"] ed applica tutte le gsub. ACRONYMS = [ ["PPC", "Pocket PC"], ... ] def expand_acronyms! ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ", " #{a[1]} ") } end Il controller diventerebbe def acronym_guide @guide = Guide.find(params[:id]) @guide.expand_acronyms! if @guide.save flash[:notice] = 'Acronimi sostituiti.' redirect_to :action => 'modifica', :id => @guide end end Non l'ho provato ma è plausibile. Idem per Page e Picture. Paolo
on 2009-12-22 11:39
Rileggendomi dopo il post mi sono accorto di un errore.
Questa linea
> ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ", " #{a[1]} ") }
doveva essere
ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ",
%( <acronym title="#{a[1]}">#{a[0]}</acronym> )) }
Te ne saresti accorto subito ma già che ci siamo facciamo le cose per
bene
Paolo
on 2009-12-22 12:27
Ciao Paolo,
grazie mille sono sicuro che questa è la strada giusta.
Perdona la mia ignoranza ma non ho capito, non so e non ho mai usato i
metodi:
ACRONYMS = [ ["PPC", "Pocket PC"], ... ]
def expand_acronyms!
ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ",
%( <acronym title="#{a[1]}">#{a[0]}</acronym> )) }
end
questo dove lo devo scrivere.
Ti prego di farmi un esempio un pò più esplicativo.
Grazie mille
on 2009-12-22 22:04
Luigi Maresca wrote: > Ciao Paolo, > grazie mille sono sicuro che questa è la strada giusta. > > Perdona la mia ignoranza ma non ho capito, non so e non ho mai usato i > metodi: Luigi, annoto un po' il codice, che va in app/models/guide.rb > ACRONYMS = [ ["PPC", "Pocket PC"], ... ] Questo definisce la costante ACRONYMS con tutto l'array delle abbreviazioni e i nomi per esteso, ma fin qui dovremmo esserci, giusto? Il metodo expand_acronims! ha il punto esclamativo in fondo solo perché è una convenzione Ruby quella di usare ! per i metodi che modificano l'oggetto su cui si applicano ma non è obbligatorio usarlo. > def expand_acronyms! > ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ", > %( <acronym title="#{a[1]}">#{a[0]}</acronym> )) } > end > > questo dove lo devo scrivere. L'ultima nota è che se non è immediatamente chiaro dove vadano questi metodi allora siamo ancora agli inizi dell'uso di Rails. Mi raccomando: tutto ciò che opera sui dati va nei modelli e se un controller diventa più lungo di 10 righe ci si deve insospettire e chiedere se c'è del codice da estrarre. Paolo > Ti prego di farmi un esempio un pò più esplicativo. > > Grazie mille
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
Log in with Google account | Log in with Yahoo account
No account? Register here.