5

에 대한 정의되지 않은 로컬 변수 또는 메소드`flash '프론트 엔드에 Omniauth-facebook 및 Devise-token-auth와 Angular 및 ng-token-auth를 사용하여 Rails-API를 빌드하고 있습니다. 그러나 레일-API이 포함되어 있지 않습니다# <Devise :: OmniauthCallbacksController : 0x007fb5d1741e48>

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

그것은 자동으로 omniauth 것 같다 플래시 미들웨어를 사용하고 난 실패 omniauth와 플래시의 사용을 비활성화되었습니다 페이스 북으로 로그인 할 때 그러나 나는 오류되게하고 . 내 구성은 다음과 같습니다 :

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 :

,210

내가 함께 플래시 오류가 발생하지 않도록 관리되지 않은 :

config.navigational_formats = [:json] 

및/omniauth을 고안 여전히 플래시 미들웨어를 사용하고 오류가 발생합니다, 어떤 도움에 감사드립니다!

답변

3

같은 문제가있었습니다. '플래시'에 대한 소스 코드를 검색했습니다. (느낌표 사용)을 사용하는 의 failure 방법을 제외하고는 모두 약 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을 설정하는 것이 여기에서 작동하지 않는 이유입니다.

결론 : 그들은 exlamation 마크를 잊어 버렸습니다.

수정 다음 OmniauthCallbacksController에서 failure 방법을 원숭이 패치.

\ 설정 \ 초기화 \ 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

예를 들어, 초기화에서이 작업을 수행 같은 레일에 문제 (5.0.0.1) + devise_token_auth (0.1.39)을했다[email protected] 공원의 대답에 재정 게다가

는 다음과 같은 추가 내 경우에 필요하다 :

# 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

관련 문제