【问题标题】:undefined local variable or method `provider' for OmniauthCallbacksControllerOmniauthCallbacksController 的未定义局部变量或方法“提供者”
【发布时间】:2014-05-28 05:09:04
【问题描述】:

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

【问题讨论】:

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


    【解决方案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} 周围的花括号,由于参数是作为符号传入的,因此还需要对其进行字符串化。

    【讨论】:

    • 谢谢!在产生双重渲染错误时也遇到了一些麻烦。我设法通过完全删除 set_flash_message 并在重定向之前使用 flash[:notice] = "blahblah" 设置它来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2018-04-19
    • 2015-01-01
    • 2013-12-17
    相关资源
    最近更新 更多