2011-09-08 9 views
7

que tuve un error de reciente utilizando OmniAuth tratando de llenar algunos campos de inicio de sesión de Googlerieles OmniAuth y UTF-8 errores

Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8

"omniauth"=> 
    {"user_info"=> 
    {"name"=>"Joe McÙisnean", 
    "last_name"=>"McÙisnean", 
    "first_name"=>"Joe", 
    "email"=>"[email protected]"}, 
    "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 estoy muy conocedor de la codificación UTF, ¿así que no estoy seguro de dónde debería especificar la codificación? Pero supongo que está aquí antes de que se ponga en el modelo de usuario y se cree, ¿no estoy seguro de qué hacer al respecto?

ACTUALIZACIÓN:

rieles 3.0.10 OmniAuth 0.2.6 de Ruby 1.9.2 PG 0.11.0

codificación predeterminada es UTF-8

que no parecían estar él, así que cavó más lejos 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: <%= f.error_messages %> 
3: 
4: <%= f.input :name, :hint => 'your real name' %> 
5: <%= f.input :nickname, :hint => 'Username of your choosing' %> 
6: 
7: <% unless @user.errors[:email].present? or @user.email %> 
8:  <%= f.input :email, :as => :hidden %> 

ACTUALIZACIÓN ACTUALIZACIÓN:

Parece ser la joya omniauth que devuelve los caracteres ASCII-8BIT, por lo 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"=>"[email protected]", "first_name"=>"Joe", "last_name"=>"Mc\xC3\x99isnean", "name"=>"Joe Mc\xC3\x99isnean"}} 

Se convierte automáticamente en UTF-8, pero explota cuando se metió en una sesión

=> {"user_info"=>{"email"=>"[email protected]", "first_name"=>"Joe", "last_name"=>"McÙisnean", "name"=>"Joe McÙisnean"}} 

Esta es una pesadilla dolorosa si alguna vez hubo una.

+1

Podría poner sus versiones de los carriles, rubí y OmniAuth? –

+0

También puede verificar la codificación de caracteres de una cadena con 'string.encoding.name'. –

+0

hecho. Agregué las versiones a mi pregunta, y el nombre de codificación de un registro de trabajo es "UTF-8" – holden

Respuesta

4

OmniAuth resultó ser el problema de la producción de la ASCII-8BIT

que terminó forzando el hash OmniAuth en la sumisión usando:

omniauth_controller.rb

session[:omniauth] = omniauth.to_utf8 

añadieron método recursivo para obligar a convertir el pícaro 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 

agradecimiento especial a Tadman

recursively convert hash containing non-UTF chars to UTF