Rieles omniauth y errores UTF-8.

Recibí un error reciente al utilizar omniauth al intentar rellenar algunos campos desde el inicio de sesión de Google

Codificación :: Error de compatibilidad: codificaciones de caracteres incompatibles: ASCII-8BIT y UTF-8

"omniauth"=> {"user_info"=> {"name"=>"Joe McÙisnean", "last_name"=>"McÙisnean", "first_name"=>"Joe", "email"=>"someemail@gmail.com"}, "uid"=> "https://www.google.com/accounts/o8/id?id=AItOawnQmfdfsdfsdfdsfsdhGWmuLTiX2Id40k", "provider"=>"google_apps"} 

En mi modelo de usuario

  def apply_omniauth(omniauth) #add some info about the user self.email = omniauth['user_info']['email'] if email.blank? self.name = omniauth['user_info']['name'] if name.blank? self.name = omniauth['user_info'][:name] if name.blank? self.nickname = omniauth['user_info']['nickname'] if nickname.blank? self.nickname = name.gsub(' ','').downcase if nickname.blank? unless omniauth['credentials'].blank? user_tokens.build(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => omniauth['credentials']['token'], :secret => omniauth['credentials']['secret']) else user_tokens.build(:provider => omniauth['provider'], :uid => omniauth['uid']) end end 

No tengo mucho conocimiento sobre la encoding UTF, así que no estoy seguro de dónde debería especificar la encoding. Pero supongo que está aquí antes de que se coloque en el modelo de usuario y se cree, ¿no estoy seguro de qué hacer al respecto?

ACTUALIZAR:

Rieles 3.0.10 Omniauth 0.2.6 Ruby 1.9.2 PG 0.11.0

La encoding predeterminada es UTF-8

Eso no parecía ser eso, así que busqué más y encontré esto en la vista:

 Showing /Users/holden/Code/someapp/app/views/users/registrations/_signup.html.erb where line #5 raised: incompatible character encodings: ASCII-8BIT and UTF-8 Extracted source (around line #5): 2:  3: 4:  'your real name' %> 5:  'Username of your choosing' %> 6: 7:  8:  :hidden %> 

ACTUALIZACIÓN ACTUALIZACIÓN:

Parece ser la gem omniauth que devuelve los caracteres ASCII-8BIT, así que mi siguiente pregunta es ¿cómo puedo analizar el hash y convertirlo de nuevo en UTF8 para que mi aplicación no explote?

session[:omniauth] = omniauth.to_utf8

Otra parte de este viaje loco es cuando escribo esto en la consola

 d={"user_info"=>{"email"=>"someemail@gmail.com", "first_name"=>"Joe", "last_name"=>"Mc\xC3\x99isnean", "name"=>"Joe Mc\xC3\x99isnean"}} 

Lo convierte automáticamente a UTF-8, pero explota cuando se lo inserta en una sesión

  => {"user_info"=>{"email"=>"someemail@gmail.com", "first_name"=>"Joe", "last_name"=>"McÙisnean", "name"=>"Joe McÙisnean"}} 

Esta es una pesadilla dolorosa si alguna vez hubo una.

Omniauth demostró ser el problema al producir el ASCII-8BIT

Terminé forzando el hash de Omniauth en la sumisión usando:

omniauth_controller.rb

 session[:omniauth] = omniauth.to_utf8 

se agregó un método recursivo para forzar la conversión del rogue ASCII-8BIT a UTF8

some_initializer.rb

 class Hash def to_utf8 Hash[ self.collect do |k, v| if (v.respond_to?(:to_utf8)) [ k, v.to_utf8 ] elsif (v.respond_to?(:encoding)) [ k, v.dup.force_encode('UTF-8') ] else [ k, v ] end end ] end end 

Gracias especiales a tadman

convertir recursivamente hash que contiene caracteres que no son UTF a UTF