我正在关注具有多个提供商的Devise + Omniauth + Rails 4的教程。我的代码非常接近sourcery tutorial的示例,只是我已经离开了可确认模块并将linkedin更改为google_oauth2。
一切正常,直到我得到回调,然后rails引发了这个错误:
NameError - undefined local variable or method `provider' for #<OmniauthCallbacksController:0x007fa8312a5298>:
(eval):7:in `twitter'
这是我的OmniauthCallbacksController(几乎与上面的链接相同):
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def self.provides_callback_for(provider)
class_eval %Q{
def #{provider}
@user = User.find_for_oauth(env["omniauth.auth"], current_user)
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: provider.capitalize) if is_navigational_format?
else
session["devise.#{provider}_data"] = env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
}
end
[:twitter, :facebook, :google_oauth2].each do |provider|
self.provides_callback_for provider
end
end
答案 0 :(得分:1)
请更改以下行:
set_flash_message(:notice, :success, kind: provider.capitalize) if is_navigational_format?
要:
set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format?
请注意#{provider}
周围的大括号,并且还需要进行字符串化,因为参数作为符号传入。