2015-03-06 11 views
15

Stiamo vivendo un bug insano in cui byte apparentemente casuali sono circa il 90% del tempo attaccati a un campo di posta elettronica proprio nel momento in cui l'email viene salvata. Ecco un esempio di ciò che potrebbe accadere:Weird Bytes Added to Attribute After Save in Rails

 
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' 

Dove diavolo ha fatto quella \u007f (il UTF-8 delete character!!!) provengono da ?! Questo è di gran lunga la spazzatura più comune che si presenta. Ecco un elenco di alcuni altri sequenze di byte validi che sono apparsi di volta in volta:

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

A volte mi fanno parecchio bit di immondizia, non posso dire se ci sono più byte di questi a causa di un errore di PG::CharacterNotInRepertoire:

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

Dati gli errori PG::CharacterNotInRepertoire che si verificano, presumo che ciò avvenga da qualche parte immediatamente prima che il valore venga salvato, ma al di fuori dello scopo del mio codice applicazione.

Si noti che questo non sta accadendo stranamente per altri campi per l'utente.

Ecco tutti i richiami che attualmente toccano l'indirizzo e-mail:

  • #strip! e #downcase! prima della convalida
  • convalida
  • formato con l'espressione regolare \A[A-Za-z0-9._%+-][email protected](?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,20}\z

Alcune informazioni app:

  • Ruby v2.2.0
  • Rails v4.1.8
  • Postgres v9.3.2
  • PG v0.17.1

risposta

2

Inoltre, si noti che se si utilizza Rails 4.2.0, c'è un problema con pg 0.18. * Che riguarda la scrittura di dati binari. Al momento ho 4.2.0 patch-scimmia con la patch che sarà in 4.2.1. Vedere https://github.com/rails/rails/pull/17680 per dettagli se si sta eseguendo 4.2.0 con Ruby 2.2 (e quindi con pg 0.18. ). Potrebbero esserci problemi simili su Rails 4.0. e 4.1. * - Non ho capito quale versione ha la patch e se queste versioni sono state ancora rilasciate.

mia scimmia-patch per 4.2.0 si presenta come:

# 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