未定义的局部变量或方法`provider'对于OmniauthCallbacksController

时间:2014-05-28 05:09:04

标签: twitter ruby-on-rails-4 devise omniauth

我正在关注具有多个提供商的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

1 个答案:

答案 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}周围的大括号,并且还需要进行字符串化,因为参数作为符号传入。