大家好啊,
我用omniauth-weibo-oauth2
做了个用微博注册的功能,主要流程就是从微薄获得用户名,和邮箱 (如果有的话),然后转到我的网站自身的注册页面 (这个时候用户名已经根据微薄的用户名填好了),完成后面的注册
基本过程就是将返回的env["omniauth.auth"]
存到一个 devise 的 session 里 session["devise.oauth_data"]
,然后在 User
中添加一个下面这样的方法:
def self.new_with_session(params, session)
# puts "Here"
# puts session["devise.oauth_data"]
super.tap do |user|
if session["devise.oauth_data"].present?
user.email = session["devise.oauth_data"].info.email if user.email.blank?
user.username = session["devise.oauth_data"].info.nickname.dup.force_encoding('UTF-8') if user.username.blank?
user.oauth = true
user.provider = session["devise.oauth_data"].provider
end
end
end
这样能成功注册,但是当用户名是中文的时候,就总会出编码错误:ActionView::Template::Error (incompatible character encodings: UTF-8 and ASCII-8BIT):
但 仍然能注册成功 。让我头痛的是,怎么会在 create 以后出错。backtrace 显示的错误是这样的:
app/views/devise/registrations/new.html.erb:24→ block in _app_views_devise_registrations_new_html_erb__FRAGMENT__
actionpack-3.2.13/lib/action_view/helpers/capture_helper.rb:40→ block in capture
actionpack-3.2.13/lib/action_view/helpers/capture_helper.rb:187→ with_output_buffer
actionpack-3.2.13/lib/action_view/helpers/capture_helper.rb:40→ capture
actionpack-3.2.13/lib/action_view/helpers/form_helper.rb:378→ form_for
simple_form-2.1.0/lib/simple_form/action_view_extensions/form_helper.rb:29→ block in simple_form_for
simple_form-2.1.0/lib/simple_form/action_view_extensions/form_helper.rb:48→ with_simple_form_field_error_proc
simple_form-2.1.0/lib/simple_form/action_view_extensions/form_helper.rb:28→ simple_form_for
app/views/devise/registrations/new.html.erb:21→ _app_views_devise_registrations_new_html_erb__FRAGMENT__
其中提到的错误来源是注册表格的这一行:
<%= f.input :username, label: t("form.username"), :required => true %>
首先,不明白 devise 怎么会在 create user 成功后又跳到 registration new form?然后是关于 UTF-8 的问题,我试着在 username 上 force_encoding, 像这样:
user.username = session["devise.oauth_data"].info.nickname.dup.force_encoding('UTF-8')
还是不行。求各位大侠帮忙啊。谢谢大家!