2010-01-25 25 views
13

Bazı eski ray uygulamalarımda Ruby 1.9'a geçiş yapmaya çalışıyorum ve "Ruby 1.9 unicode normalizasyonunu henüz desteklemediği" konusunda uyarılar alıyorum. Bu işleve onu takip ettik, ancak istek başına yaklaşık 20 uyarı mesajları alıyorum:Ruby 1.9, Unicode normalizasyonunu desteklemiyor

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

Herhangi fikirleri Bunları izlemeyi ve çözmeyi nasıl başlamalıyım?

cevap

9

, yani aksanlı karakterler Yakut 1.9.1 + Raylar 2.3.x içinde çevirilir olmayacak/config sessizliğe başlatıcıları bu yerleştirmek uyarı:

# 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 

Raylar 3 gerçekten bu sorunu çözmek, bu nedenle daha geleceğe dönük çözüm olduğunu doğru göç etmek olacaktır.

2

Bu yöntem tanımı, Ruby 1.9 için bir if deyimine sarılır. Tam üstünde, bunun ne yaptığını biraz daha gösteren düzenli tanımı bulacaksınız. Vurgulu karakterleri normal değişkenlerine dönüştürmek için kullanılan bir yöntemdir. Örn .: á =>a veya ë =>e

Ancak bu yöntem yalnızca sırayla sağ transliterasyon yukarıda tanımlandığı parametrelendiriniz, kullanılır. Bu hala ActiveSupport'ta. Doğrudan parametreleştirme yapan hiçbir şey bulamıyorum.

Belki de Rails uygulamanızda bir yere kendinizi parametreleştirme veya çevirme kullanıyorsunuz? (Parametrelerle belgelerine göre)

yaygın kullanımı

SO, örneğin yaptığı gibi, rasgele dizeleri için uygun kalıcı bağlantı oluşturmak için:

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

ile yönteminin gövdesini yerine

raise "transliterate called" 

ve ilk çağrıda eşyaların nereden geldiğini gösteren bir backtrace gözlemleyin. Uygulamanız da elbette çökecek, ancak muhtemelen ilk denemeden sorumlu olacak.

1

Bu sorunun çözülmesi için kirli bir yöntem olduğunu, ancak sorunun farkında olduğum hata iletisini okudum. Bu yüzden uyarılardan kurtulmak istiyorum. Ben environment.rb bu kodu düştü: bunun sonuçlarının farkında değilseniz

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

Bunun yerine değil maymun Inflector modülü yama ediyorum, ayrıca bunu yapabilirsiniz ...

bu can sıkıcı sessizlik benim için çalıştı Aşağıdakilerden Hem

"Unicode normalleşmesini desteklemez Ruby 1.9 henüz" uyarı: Bu bir tekniktir

silence_stream(STDERR) { 
    whatever_code_caused_transliterate_to_be_called 
} 

veya

silence_warnings { 
    whatever_code_caused_transliterate_to_be_called 
} 

Bu sizin çağıran kodunu yığılan gerektirir dezavantajı var, ama bir Genellikle uyarıları veya diğer çıktıları görmek istemediğinizde kullanabilirsiniz.

activesupportStringEx Gem oldukça iyi iş gibi görünüyor activesupport-2.3.11/lib/active_support/core_ext/kernel/reporting.rb

+0

Bence "dağınıklık", yalnızca belirli durumlar için uyarıları susturmak ve diğer okuyucuların susturulduğunu açıkça ortaya koymak için buna değer. –

4

içinde silence_stream ve silence_warnings sağlar. Iconv'e de bağımlılığı yoktur.

O "to_ascii" kutunun dışında güzel çevirisini yapar ki gibi String sınıfı için bazı yöntemler ekleyen

: Ayrıca

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

, Babosa Gem bile dil ile UTF-8 dizeleri transliterating işini iyi yapıyor destek:

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

keyfini çıkarın.

İlgili konular