5

のための未定義のローカル変数またはメソッド `フラッシュ 'フロントエンドにOmniauth-facebookとDevise-token-authとAngularとng-token-authを使用してRails-APIをビルドします。しかし、レール-APIはこれを含んでいない#define :: OmniauthCallbacksController:0x007fb5d1741e48>

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

は、それが自動的にomniauth思わフラッシュミドルウェアを使用していますし、私は失敗したomniauthでのフラッシュの使用を無効にされています:Facebookのアカウントでログインするときに しかし、私はエラーを提示しています。 私の構成は以下の通りです:

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] 

および/ omniauthを考案まだ任意のヘルプは感謝、フラッシュミドルウェアを使用して、エラーをスローしています!

答えて

3

同じ問題がありました。 deviseのソースコードで 'flash'を検索しました。 のfailureメソッド(除外記号なし)を使用したset_flash_message!(感嘆符付き)を使用する約17試合が見つかりました。定義を見ると、我々は、次を参照してください。

アプリの\コントローラ\ \工夫\ 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に\工夫\コントローラ\ helpers.rb

def is_flashing_format? 
    is_navigational_format? 
end 

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

ザ・実際のフラッシュメッセージは、感嘆符なしの方法で生成されます(私はそれを逆にしてしまいました...)。他の解決策で述べたようにnavigational_formatsを設定しても効果がありません。

結論:拍手マークを忘れてしまった。

修正OmniauthCallbacksControllerからfailure方法をサルパッチ。

\ CONFIG \初期化子\ 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 
0

、例えば、初期化子でこれを行うには、同じRailsの問題(5.0.0.1)+ devise_token_auth(0.1.39)を有していました。

@公園の答えでオーバーライドに加えて、以下の添加が、私の場合にも必要である:

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

確かに真の、あまりにもそれを把握するために私にいくつかの時間がかかりました!付録のThnx。 –

+0

あなたはいくつかの部分を欠いています。 Omniauthでセッションストレージを構成するためです。あなたが実際に望むのは、公式の指示に従うことです:https://github.com/omniauth/omniauth#integrating-omniauth-into-your-rails-api – sarink