2010-01-25 14 views
13

Estoy tratando de portar algunas de mis aplicaciones antiguas de rieles a Ruby 1.9 y sigo recibiendo advertencias sobre cómo "Ruby 1.9 aún no admite la normalización Unicode". He rastreado hacia abajo para esta función, pero yo estoy poniendo unos 20 mensajes de advertencia por solicitud:Ruby 1.9 no es compatible con la normalización Unicode aún

carriles-2.3.5/ActiveSupport/lib/active_support/inflector.rb

def transliterate(string) 
    warn "Ruby 1.9 doesn't support Unicode normalization yet" 
    string.dup 
end 

Todas las ideas ¿Cómo debería comenzar a rastrearlos y resolverlos?

Respuesta

9

Si usted es consciente de las consecuencias, es decir, caracteres acentuados no se transliterados en Ruby 1.9.1 + Rails 2.3.x, colocar esto en config/inicializadores a silencio la advertencia:

# http://stackoverflow.com/questions/2135247/ruby-1-9-doesnt-support-unicode-normalization-yet 
module ActiveSupport 
    module Inflector 
    # Calling String#parameterize prints a warning under Ruby 1.9, 
    # even if the data in the string doesn't need transliterating. 
    if Rails.version =~ /^2\.3/ 
     undef_method :transliterate 
     def transliterate(string) 
     string.dup 
     end 
    end 
    end 
end 

Rails 3 en efecto, a resolver este problema, por lo que una solución más preparada para el futuro sería migrar hacia eso.

2

Esa definición de método se envuelve en una instrucción if para Ruby 1.9. Justo encima, encontrarás la definición regular, que muestra un poco más de lo que está haciendo. Es un método usado para convertir caracteres acentuados en sus variantes regulares. Ej .: á =>a o ë =>e

Pero este método sólo se utiliza en Parameterize, que a su vez define justo encima transliterate. Esto todavía está en ActiveSupport. No puedo encontrar nada que esté llamando directamente a parametrizar.

¿Quizás esté usando parametrizar o transcribir, en algún lugar de su aplicación Rails?

El uso común (de acuerdo con la documentación Parameterize) es para la creación de enlaces permanentes amistosos de cadenas arbitrarias, al igual que lo hace, por ejemplo:

http://stackoverflow.com/questions/2135247/ruby-1-9-doesnt-support-unicode-normalization-yet 
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
2

sustituir el cuerpo del método con

raise "transliterate called" 

y observe una traza inversa que le mostrará de dónde viene el material en la primera llamada. Tu aplicación, por supuesto, se colapsará también, pero eso probablemente te dará el culpable desde el primer intento.

1

Aprecio que esta es una manera sucia de resolver el problema, pero después de leer el mensaje de error, soy consciente del problema. Así que quiero deshacerme de las advertencias. Se me cayó este código en environment.rb:

module ActiveSupport 
    module Inflector 
    # Calling String#parameterize prints a warning under Ruby 1.9, 
    # even if the data in the string doesn't need transliterating. 
    # Maybe Rails 3 will have fixed it...? 
    if RAILS_GEM_VERSION =~ /^2\.3/ 
     undef_method :transliterate 
     def transliterate(string) 
     string.dup 
     end 
    end 
    end 
end 
1

Si prefiere no mono parchear el módulo Inflector, también se puede hacer esto ...

ambos de los siguientes trabajó para mí para silenciar este molesto "Ruby 1.9 no soporta la normalización Unicode todavía" advertencia:

silence_stream(STDERR) { 
    whatever_code_caused_transliterate_to_be_called 
} 

o

silence_warnings { 
    whatever_code_caused_transliterate_to_be_called 
} 

Esto tiene la desventaja de que requiere estorbar encima de su código de llamada, pero es una técnica puede usar generalmente cuando no quiera ver advertencias u otros resultados.

activesupport proporciona silence_stream y silence_warnings en activesupport-2.3.11/lib/active_support/core_ext/kernel/reporting.rb

+0

Creo que el "desorden" vale la pena para poder silenciar las advertencias solo para casos específicos y también para hacer que otros lectores queden silenciados. –

4

El StringEx Gem parece que funciona bastante bien. No tiene dependencia en Iconv tampoco.

Se añade algunos métodos de la clase String, como "to_ascii", que hace hermosa transliteración de la caja:

require 'stringex' 
"äöüÄÖÜßë".to_ascii #=> "aouAOUsse" 

Además, el Babosa Gem hace un gran trabajo transliteración de caracteres UTF-8 cuerdas, incluso con el lenguaje ayuda:

"Jürgen Müller".to_slug.transliterate.to_s   #=> "Jurgen Muller" 
"Jürgen Müller".to_slug.transliterate(:german).to_s #=> "Juergen Mueller" 

Enjoy.

0

Cadena # unicode_normalize, Cadena # unicode_normalize!, Cadena # unicode_normalized? se presentará en Ruby 2.2. El código de muestra y la implementación se pueden ver en test case, lib/unicode_normalize.rb y lib/unicode_normalize/normalize.rb.

// U+00E1: LATIN SMALL LETTER A WITH ACUTE 
// U+U+0301: COMBINING ACUTE ACCENT 

puts "\u00E1" == "a\u0301".unicode_normalize(:nfc) 
puts true == "a".unicode_normalized?(:nfc) 
Cuestiones relacionadas