【问题标题】:undefined local variable or method `flash' for #<Devise::OmniauthCallbacksController:0x007fb5d1741e48>#<Devise::OmniauthCallbacksController:0x007fb5d1741e48> 的未定义局部变量或方法“flash”
【发布时间】:2016-10-05 17:10:18
【问题描述】:

我正在构建一个 Rails-API,使用 Omniauth-facebook 和 Devise-token-auth 以及 Angular 和 ng-token-auth 作为前端。 但是,当我使用 facebook 登录时,会出现以下错误:

undefined local variable or method `flash' for #<Devise::OmniauthCallbacksController:0x007fd027a51e10>

omniauth 似乎会自动使用 flash 中间件,但 rails-api 不包含此中间件,而且我一直未能成功禁用带有omniauth 的 flash。 我的配置如下:

应用程序.rb:

    require File.expand_path('../boot', __FILE__)

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module PathfinderApi
  class Application < Rails::Application
    config.active_record.raise_in_transactional_callbacks = true


    config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end

    config.api_only = true
    config.middleware.use ActionDispatch::Flash
    config.middleware.use ActionDispatch::Cookies
    config.middleware.use ActionDispatch::Session::CookieStore
  end
end

devise_token_auth.rb:

DeviseTokenAuth.setup do |config|
  Rails.application.secrets.facebook_app_secret
  config.change_headers_on_each_request = true
end

设计.rb:

Devise.setup do |config|
  config.navigational_formats = [:json]
end

omniauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook,      ENV['APP_KEY'], ENV['APP_SECRET']
end

我没有设法通过以下方式禁用闪存错误:

config.navigational_formats = [:json]

并且 devise/omniauth 仍在使用 flash 中间件并引发错误,感谢任何帮助!

【问题讨论】:

    标签: ruby-on-rails devise middleware rails-api omniauth-facebook


    【解决方案1】:

    遇到了同样的问题。在设计源代码中搜索“flash”。找到了大约 17 个匹配项,全部使用set_flash_message!(带感叹号),除了OmniauthCallbacksController 中的failure 方法使用set_flash_message(不带感叹号)。查看我们看到的定义:

    \app\controllers\devise\omniauth_callbacks_controller.rb

    # Sets flash message if is_flashing_format? equals true
    def set_flash_message!(key, kind, options = {})
      if is_flashing_format?
        set_flash_message(key, kind, options)
      end
    end
    

    \lib\devise\controllers\helpers.rb

    def is_flashing_format?
      is_navigational_format?
    end
    
    def is_navigational_format?
      Devise.navigational_formats.include?(request_format)
    end
    

    实际的 flash 消息是在没有感叹号的方法中生成的(我会以另一种方式对其进行编程......)。缺少感叹号是其他解决方案中提到的设置navigational_formats 在这里不起作用的原因。

    结论:他们忘记了感叹号。

    修复:对OmniauthCallbacksController 中的failure 方法进行猴子补丁。在初始化程序中执行此操作,例如在

    \config\initializers\devise.rb

    Rails.application.config.to_prepare do              # to_prepare ensures that the monkey patching happens before the first request
      Devise::OmniauthCallbacksController.class_eval do # reopen the class
        def failure                                     # redefine the failure method
          set_flash_message! :alert, :failure, kind: OmniAuth::Utils.camelize(failed_strategy.name), reason: failure_message
          redirect_to after_omniauth_failure_path_for(resource_name)
        end
      end
    end
    

    【讨论】:

      【解决方案2】:

      在 Rails (5.0.0.1) + devise_token_auth (0.1.39) 中遇到同样的问题。

      除了@Koen 的回答中的覆盖之外,在我的情况下还需要以下添加:

      # in config/application.rb
        config.middleware.use ActionDispatch::Cookies
      

      【讨论】:

      • 绝对正确,我也花了一些时间才弄清楚!谢谢附录。
      • 你丢失了一些片段。这是用于使用 Omniauth 配置会话存储。您真正想要的是遵循他们的官方指示:github.com/omniauth/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2017-01-26
      • 2018-04-19
      相关资源
      最近更新 更多