2017-11-28 8 views
1

around_action :set_time_zone (또는 before_filter :set_time_zone)을 응용 프로그램 컨트롤러에 추가해야합니다. 문제는 current_user이 필터 뒤에 Devise 인증이 실행되기 때문에 항상 nil이라는 것입니다.Devise 인증 후 필터 추가

나는 current_user에 액세스하여 표준 시간대를 얻을 수 있도록 Devise 인증 후 필터를 실행하고 싶습니다.

내 코드 : 나는 ExampleControllerauthenticate_user!을 유지하고 ApplicationControllerset_time_zone을 유지하고 싶은

class ApplicationController < ActionController::Base 
    around_action :set_time_zone 

    private 

    def set_time_zone 
    current_user.time_zone # this raises an expception because current_user is nil 
    end 
end 

class ExampleController < ApplicationController 
    before_action :authenticate_user! 
end 

.

나는 또한 append_before_filter :set_time_zone을 사용해 보았지만 문제를 해결하지 못했습니다.

+0

내가 Github에서에 문제를 열었습니다 : 이것은 (https://github.com/rails/rails/issues/31259) – collimarco

답변

0

Devise는 백그라운드에서 감시자를 사용하며 여러 콜백을 제공합니다. (각 세션에서 처음으로) 사용자가 인증 될 때마다 실행 after_authentication 콜백에서보세요 :

예 :

Warden::Manager.after_authentication do |user,auth,opts| 
    user.time_zone 
end 

그냥 새로운 초기화 파일을 만들고 거기에 코드를 삽입. ( /config/initializers/warden_callbacks.rb)

+0

[append_before_action는 before_action 전에 실행] 유용한 팁! 그러나 때로는 API 키를 사용하여 인증에 사용할 수 없으므로 컨트롤러에서 Rails 필터를 사용해야합니다. – collimarco

+0

아하이오! 내가 무엇을 찾을 수 있는지 주위를 검색하자. 좋은 질문입니다! – Cyzanfar