2011-09-08 17 views
7

Miałem niedawnej błąd za pomocą omniauth próbuje wypełnić kilka pól z logowania Googleszyny omniauth i UTF-8 błędy

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"} 

W moim modelu użytkownika

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 

ja nie jestem bardzo dobrze zna się na kodowaniu UTF, więc nie jestem pewien, gdzie powinienem podawać kodowanie? Ale domyślam się, że jest tutaj, zanim zostanie wprowadzony do modelu użytkownika i stworzony, nie jestem pewien, co z tym zrobić?

UPDATE:

Szyny 3.0.10 Omniauth 0.2.6 Ruby 1.9.2 PG 0.11.0

Domyślne kodowanie UTF-8

To nie wydaje się być Opisz więc wykopał dalej i znalazłem to w widoku:

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

UPDATE UPDATE:

Wygląda na to, że jest to klejnot omniauth, który zwraca znaki ASCII-8BIT, więc następne pytanie brzmi: jak mogę przetworzyć skrót i przekonwertować go z powrotem na UTF8, aby moja aplikacja nie eksplodowała?

session[:omniauth] = omniauth.to_utf8

Kolejna część do tej szalonej jazdy jest po wpisaniu tego do konsoli

d={"user_info"=>{"email"=>"[email protected]", "first_name"=>"Joe", "last_name"=>"Mc\xC3\x99isnean", "name"=>"Joe Mc\xC3\x99isnean"}} 

automatycznie konwertuje go na UTF-8, ale wybucha gdy wepchnięto sesji

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

To jest bolesny koszmar, jeśli kiedykolwiek taki był.

+1

można umieścić swoje wersje szyn, rubin i omniauth? –

+0

Możesz również sprawdzić kodowanie znaków w łańcuchu za pomocą "string.encoding.name". –

+0

zrobione. Dodałem wersje do mojego pytania, a encoding.name z działającego rekordu to "UTF-8" – holden

Odpowiedz

4

Omniauth okazał się problem wytwarzania ASCII-8BIT

skończyło się zmuszanie hash Omniauth do uległości za pomocą:

omniauth_controller.rb

session[:omniauth] = omniauth.to_utf8 

dodaje metody rekurencyjnej, aby wymusić nawróconego nieuczciwy ASCII-8BIT do 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 

Specjalne podziękowania dla tadman

recursively convert hash containing non-UTF chars to UTF