Sostituzione caratteri special

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:

@[email protected](/Ã /,“à”)
@[email protected](/è/,“è”)
@[email protected](/ì/,“ì”)
@[email protected](/ò/,“ò”)
@[email protected](/ù/,“ù”)
@[email protected](/é/,“é”)

@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

chi mi aiuta, per piacere?

Grazie

2009/12/18 Luigi M. [email protected]:

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

[1] http://htmlentities.rubyforge.org/

Vi ringrazio per le risposte,
ma dato che la stessa funzione mi serve per fare anche altro come:

@[email protected](/ PPC /," <acronym
title=#{34.chr}Pocket PC#{34.chr}>PPC ")

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

Luigi M. wrote:

Vi ringrazio per le risposte,
ma dato che la stessa funzione mi serve per fare anche altro come:

@[email protected](/ PPC /," <acronym
title=#{34.chr}Pocket PC#{34.chr}>PPC ")

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

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

Ciao,

prova ad usare il suggerimento riportato all’url

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 M. [email protected]
wrote:


Emilio Frusciante

“Go and spread the free software. Happy hacking!” - RMS

Luigi M. 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 ")

si può scrivere più succintamente e più leggibilmente come

" PPC ".gsub(/ PPC /, %( PPC ))

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

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.

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]} ",
%( #{a[0]} )) }

Te ne saresti accorto subito ma già che ci siamo facciamo le cose per
bene

Paolo

Luigi M. 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]} ",
%( #{a[0]} )) }
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

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]} ",
%( #{a[0]} )) }
end

questo dove lo devo scrivere.

Ti prego di farmi un esempio un pò più esplicativo.

Grazie mille