2

Users은 모두 Character과의 관계가 has_many입니다. 이제 그들은 응용 프로그램을 사용할 수 있기 전에 먼저 주인을 선택하기 전까지 한 문자를 기본으로 선택해야하므로 문자를 members 컨트롤러 표시 방법으로 리디렉션하고 싶습니다.전체 컨트롤러에 대한 필터 할당 예외 전

그러나 내 접근 방식은 작동하는데, 예를 들어 누군가가 주인을 선택하기 전에 로그 아웃하려고 할 때 그 사람이 member_path으로 리디렉션하는 문제가 있습니다. 이 규칙과 컨트롤러의 members 컨트롤러에 예외로 컨트롤러를 추가하려면 어떻게해야합니까? 에서

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :check_for_main 
    skip_before_filter :check_for_main, :only => [:members => :show, :users => :sign_out] 

    # Check if user has a main character selected 
    private 
    def check_for_main 

     # Check signed in user 
     if user_signed_in? 

      # Check associated characters if any are set as main 
      redirect_to member_path(current_user.id), :alert => "Please select your main character." 
      unless current_user.characters.any?(&:main) 

      end 
     end 
    end 

end 

답변

1

해야한다 : skip_before_filter를. 내 첫 시도는 skip_before_filter을 추가하여 컨트롤러 자체를 고안했지만 실제로는 피해야합니다.

어쨌든 rake routes을 실행하면 장치 컨트롤러가 실제로 이름 앞에 devise/ prefixdevise/controller_name이라는 이름으로 표시됩니다. 이후 컨트롤러를 추가로 확장하지 않을 것이기 때문에, 의미있는 개념 만이 메소드에 조건문을 추가하는 것이 었으므로 자체 패키지에서 요청을 건너 뜁니다.

다른 모든 컨트롤러의 경우 나는 @Stuart M 어드바이스를 따랐습니다.

내 새로운 코드 :

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :check_for_main 

    # Check if user has a main character selected 
    private 
    def check_for_main 

     # Check signed in user 
     if user_signed_in? 

      if not params[:controller].to_s.include? "devise" 
       # Check associated characters if any are set as main 
       if not current_user.characters.any?(&:main) 
        redirect_to member_path(current_user.id), :alert => "Please select your main character." 
       end 
      end 
     end 
    end 

end 
1

모두 당신의 MembersControllerUsersController 당신이 필터를 생략해야하는 그 컨트롤러의 :only 옵션을 지정하는 조치 (들)과 skip_before_filter :check_for_main이 있어야합니다. 현재

skip_before_filter :check_for_main, :only => [:members => :show, :users => :sign_out] 

을하지만 그 대신 나는 그냥 한 줄에 대한 컨트롤러 고안 하위 클래스 다른 컨트롤러를 추가하여 내 코드를 오염 싶지 않았다

# in MembersController 
skip_before_filter :check_for_main, :only => [:show] 

# in UsersController 
skip_before_filter :check_for_main, :only => [:sign_out]  
+0

내 문제가 있지만 내가 사용자의 컨트롤러를 필요가 없다는 것을 알고있다. –

+0

': sign_out' 액션은 컨트롤러의 일부입니까? –

+0

액세스 할 수없는 장치 컨트롤러의 일부입니다. –