2015-03-06 11 views
15

Mamy niesamowity błąd, w którym pozornie losowe bajty to około 90% czasu, w którym są umieszczane na polu wiadomości e-mail bezpośrednio w momencie zapisywania wiadomości e-mail. Oto przykład tego, co może nastąpić:Dziwne bajty dodane do atrybutu po zapisaniu w szynach

 
From params: '[email protected]' 
Before validate: '[email protected]' 
After validate: '[email protected]' 
Before save: '[email protected]' 
Value in object after save: '[email protected]' 
Retrieve record just created by id, and fetch id: '[email protected]\u007f' 

Gdzie do cholery to się \u007f (the UTF-8 delete character!!!) pochodzą z ?! To zdecydowanie najczęstsze śmieci, które się pojawiają. Oto lista niektórych innych ważnych sekwencji bajtów, które pojawiły się od czasu do czasu:

 
r\u007f 
U\u007f 
a\u007f 
#m$\u007f 

Czasem mam całkowite bity śmieci, nie mogę powiedzieć, czy istnieje więcej bajtów niż te z powodu błędu PG::CharacterNotInRepertoire:

0xde 0x4d 
0xf6 0x7f 
0xbc 
0xe3 0x6c 0x24 

Biorąc pod uwagę występujące błędy PG::CharacterNotInRepertoire, zakładam, że dzieje się to gdzieś tuż przed zapisaniem wartości, ale poza zakresem mojego kodu aplikacji.

Należy zauważyć, że nie dzieje się to dziwnie dla innych pól dla użytkownika.

Oto wszystkie wywołania zwrotne, które obecnie dotykają adres e-mail:

  • #strip! i #downcase! przed potwierdzeniem
  • Format walidacja z regex \A[A-Za-z0-9._%+-][email protected](?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,20}\z

Niektóre informacje app:

  • Ruby v2.2.0
  • szyn v4.1.8
  • Postgresa v9.3.2
  • PG v0.17.1

Odpowiedz

2

Należy również pamiętać, że jeśli używasz Rails 4.2.0, występuje problem z pg 0.18. *, Który wpływa na zapisywanie danych binarnych. Obecnie mam łatkę w wersji 4.2.0 z łatką, która będzie w wersji 4.2.1. Aby uzyskać szczegółowe informacje, zobacz https://github.com/rails/rails/pull/17680, jeśli korzystasz z wersji 4.2.0 z Ruby 2.2 (a więc z pg 0.18., ). W Railsach 4.0 mogą występować podobne problemy. i 4.1. * - Nie wiem, która wersja ma łatkę i czy te wersje zostały już wydane.

Moja małpa-patch do 4.2.0 wygląda następująco:

# Should release in Rails 4.2.1 
# PostgreSQL, Fix change detection caused by superfluous bytea unescaping 
# See https://github.com/rails/rails/pull/17680 
if Rails.version == '4.2.0' 
    module ActiveRecord 
    module ConnectionAdapters 
     module PostgreSQL 
     module OID # :nodoc: 
      class Bytea < Type::Binary # :nodoc: 
      def type_cast_from_database(value) 
       return if value.nil? 
       return value.to_s if value.is_a?(Type::Binary::Data) 
       PGconn.unescape_bytea(super) 
      end 
      end 
     end 
     end 
    end 
    end 
end