У меня была недавняя ошибка, используя Omniauth, пытаясь заполнить некоторые поля из логина Google
, кодируя :: CompatibilityError: несовместимые кодировки символов: ASCII-8bit и 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"}
в моей модели пользователя
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
Я не очень осведомлен о кодировке UTF, поэтому я не уверен, где я должен указывать кодировку? Но я предполагаю, что здесь, прежде чем он получит вставку в пользовательскую модель и создал, я не уверен, что с этим поделать?
Обновление:
Rails 3.0.10 Omniauth 0.2.6. Ruby 1.9.2 PG 0.11.0
Кодировка по умолчанию - это UTF-8
, которое, казалось, не было, поэтому я выкопал дальше и нашел это в поле зрения:
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 %>
Обновление обновления:
, кажется, GEM OMNIAUTH, которая возвращает ASCII-8bit Chars, поэтому мой следующий вопрос в том, как я могу разбирать хеш и преобразовать его обратно в UTF8, чтобы мое приложение не взорвалось?
сеанс [: OMNIAUTH] = OMNIAUTH.TO__UTF8
Другая частью этой безумной езды - это когда я ввожу это в консоль
d={"user_info"=>{"email"=>"someemail@gmail.com", "first_name"=>"Joe", "last_name"=>"Mc\xC3\x99isnean", "name"=>"Joe Mc\xC3\x99isnean"}}
, он автоматически преобразует его в UTF-8, но он взрывается при выключении в сеанс
=> {"user_info"=>{"email"=>"someemail@gmail.com", "first_name"=>"Joe", "last_name"=>"McÙisnean", "name"=>"Joe McÙisnean"}}
Это болезненный кошмар, если бы когда-либо был один.