У меня была недавняя ошибка при использовании omniauth при заполнении некоторых полей из логина Google
Encoding :: 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, поэтому я не уверен, где мне следует указывать кодировку? Но я предполагаю, что он здесь, пока его не поместили в пользовательскую модель и не создали, я не уверен, что с этим делать?
UPDATE:
Rails 3.0.10
Омниаут 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 %>
ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ:
Кажется, это драгоценный камень omniauth, который возвращает символы ASCII-8BIT, поэтому мой следующий вопрос: как мне разобрать хеш и преобразовать его обратно в UTF8, чтобы мое приложение не взорвалось?
session[: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"}}
Это болезненный кошмар, если когда-либо был.