未定义的局部变量或方法`flash'for#<Devise :: OmniauthCallbacksController:0x007fb5d1741e48>

Sac*_*ria 6 middleware ruby-on-rails devise rails-api omniauth-facebook

我正在使用Omniauth-facebook和Devise-token-auth构建一个Rails-API,其中Angular和ng-token-auth用于前端.但是当用facebook登录时,我会看到错误:

undefined local variable or method `flash' for #<Devise::OmniauthCallbacksController:0x007fd027a51e10>
Run Code Online (Sandbox Code Playgroud)

似乎omniauth自动使用闪存中间件但是rails-api不包括这个,并且我没有成功禁用使用omniauth的flash.我的配置如下:

application.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
Run Code Online (Sandbox Code Playgroud)

devise_token_auth.rb:

DeviseTokenAuth.setup do |config|
  Rails.application.secrets.facebook_app_secret
  config.change_headers_on_each_request = true
end
Run Code Online (Sandbox Code Playgroud)

devise.rb:

Devise.setup do |config|
  config.navigational_formats = [:json]
end
Run Code Online (Sandbox Code Playgroud)

omn​​iauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook,      ENV['APP_KEY'], ENV['APP_SECRET']
end
Run Code Online (Sandbox Code Playgroud)

我没有设法禁用闪存错误:

config.navigational_formats = [:json]
Run Code Online (Sandbox Code Playgroud)

和devise/omniauth仍然使用闪存中间件并抛出错误,任何帮助赞赏!

Ray*_*dus 5

有同样的问题。在设计源代码中搜索“ flash”。找到了约17个匹配项,所有匹配项都使用set_flash_message!(带有感叹号),但使用中的failure方法OmniauthCallbacksController使用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
Run Code Online (Sandbox Code Playgroud)

\ lib \ devise \ controllers \ helpers.rb

def is_flashing_format?
  is_navigational_format?
end

def is_navigational_format?
  Devise.navigational_formats.include?(request_format)
end
Run Code Online (Sandbox Code Playgroud)

实际的闪断消息是在没有感叹号的方法中生成的(我本来会以其他方式处理它的...)。缺少的感叹号是为什么navigational_formats其他解决方案中提到的设置在这里不起作用的原因。

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

解决方法:猴子failure从中修补该方法OmniauthCallbacksController。在初始化程序中执行此操作,例如在

\ 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
Run Code Online (Sandbox Code Playgroud)