#<Devise::OmniauthCallbacksController:0x007fb5d1741e48> 的未定义局部变量或方法“flash”
undefined local variable or method `flash' for #<Devise::OmniauthCallbacksController:0x007fb5d1741e48>
我正在使用 Omniauth-facebook 和 Devise-token-auth 构建一个 Rails-API,前端使用 Angular 和 ng-token-auth。
但是,当使用 facebook 登录时,出现错误:
undefined local variable or method `flash' for #<Devise::OmniauthCallbacksController:0x007fd027a51e10>
似乎 omniauth 自动使用 flash 中间件,但是 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
devise_token_auth.rb:
DeviseTokenAuth.setup do |config|
Rails.application.secrets.facebook_app_secret
config.change_headers_on_each_request = true
end
devise.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 中间件并抛出错误,感谢任何帮助!
有同样的问题。在设计源代码中搜索 '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
在 Rails (5.0.0.1) + devise_token_auth (0.1.39) 中有同样的问题。
除了@Koen的回答中的override之外,我的情况还需要添加以下内容:
# in config/application.rb
config.middleware.use ActionDispatch::Cookies
我正在使用 Omniauth-facebook 和 Devise-token-auth 构建一个 Rails-API,前端使用 Angular 和 ng-token-auth。 但是,当使用 facebook 登录时,出现错误:
undefined local variable or method `flash' for #<Devise::OmniauthCallbacksController:0x007fd027a51e10>
似乎 omniauth 自动使用 flash 中间件,但是 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
devise_token_auth.rb:
DeviseTokenAuth.setup do |config|
Rails.application.secrets.facebook_app_secret
config.change_headers_on_each_request = true
end
devise.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 中间件并抛出错误,感谢任何帮助!
有同样的问题。在设计源代码中搜索 '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
在 Rails (5.0.0.1) + devise_token_auth (0.1.39) 中有同样的问题。
除了@Koen的回答中的override之外,我的情况还需要添加以下内容:
# in config/application.rb
config.middleware.use ActionDispatch::Cookies