복붙노트

[RUBY-ON-RAILS] 어떻게 고안를 사용하여 자신의 역할에 따라 사용자의 홈 (루트) 경로를 재 지정할 수 있습니다?

RUBY-ON-RAILS

어떻게 고안를 사용하여 자신의 역할에 따라 사용자의 홈 (루트) 경로를 재 지정할 수 있습니다?

나는 프로젝트 관리 응용 프로그램에서 일하고 있어요, 앱에, 나는 project_managers와 클라이언트를 가지고있다. 나는 인증 / 권한 부여를 위해 고안와 캉캉을 사용하고 있습니다.

로그인 후 어떤 시점에서 자신의 특정 컨트롤러 / 레이아웃 /보기로 사용자를 리디렉션해야 하는가? 그들은 프로젝트 관리자 또는 클라이언트있어 여부에 따라 루트 (또는 리디렉션) routes.rb에 current_user.role를 확인하고 설정하는 방법이 있나요? 이것은 내가 고안의 어딘가에서 만들 수있는 변화인가?

어떤 도움에 미리 감사드립니다! --표

해결법

  1. ==============================

    1.특정 루트 경로를 지정하는 데 사용할 수 없습니다 귀하의 routes.rb 파일은 사용자가 가지고있는 어떤 역할 어떤 생각을 가지고 있지 않습니다.

    특정 루트 경로를 지정하는 데 사용할 수 없습니다 귀하의 routes.rb 파일은 사용자가 가지고있는 어떤 역할 어떤 생각을 가지고 있지 않습니다.

    당신이 할 수있는 것은 결국 역할과 리디렉션을 읽을 수 있습니다 (예를 들어, passthrough_controller.rb) 컨트롤러를 설정됩니다. 이 같은:

    # passthrough_controller.rb
    class PassthroughController < ApplicationController
      def index
        path = case current_user.role
          when 'project_manager'
            some_path
          when 'client'
            some_other_path
          else
            # If you want to raise an exception or have a default root for users without roles
        end
    
        redirect_to path     
      end
    end
    
    # routes.rb
    root :to => 'passthrough#index'
    

    이 방법은 모든 사용자가 차례로 자신의 역할에 따라 적절한 컨트롤러 / 액션로 리디렉션 항목의 한 지점을해야합니다.

  2. ==============================

    2.가장 간단한 해결책은 사용 람다이다 :

    가장 간단한 해결책은 사용 람다이다 :

    root :to => 'project_managers#index', :constraints => lambda { |request| request.env['warden'].user.role == 'project_manager' }
    root :to => 'clients#index'
    
  3. ==============================

    3.또 다른 옵션은이 같은 인증 방법 (I이 예에서 rolify을 사용하고 있습니다)에 PROC를 전달하는 것입니다 :

    또 다른 옵션은이 같은 인증 방법 (I이 예에서 rolify을 사용하고 있습니다)에 PROC를 전달하는 것입니다 :

    authenticated :user, ->(u) { u.has_role?(:manager) } do
      root to: "managers#index", as: :manager_root
    end
    
    authenticated :user, ->(u) { u.has_role?(:employee) } do
      root to: "employees#index", as: :employee_root
    end
    
    root to: "landing_page#index"
    

    각 루트 경로의 고유 한 이름을 지정해야 4 레일에 대한 자세한 내용은이 문제를 볼 수 있습니다.

  4. ==============================

    4.내가 소장을 사용하는 레일 3 응용 프로그램에서이 작업을 수행. 유증은 소장의 상단에 내장되어 있기 때문에, 나는 당신을 위해 일 거라고 생각하지만,에 의존하기 전에 그것으로 약간의 실험을해야합니다.

    내가 소장을 사용하는 레일 3 응용 프로그램에서이 작업을 수행. 유증은 소장의 상단에 내장되어 있기 때문에, 나는 당신을 위해 일 거라고 생각하지만,에 의존하기 전에 그것으로 약간의 실험을해야합니다.

    class ProjectManagerChecker
      def self.matches?(request)
        request.env['warden'].user.role == 'project_manager'
      end
    end
    
    # routes.rb
    get  '/' => 'project_managers#index', :constraints => ProjectManagerChecker
    get  '/' => 'clients#index'
    

    사용자의 역할이 "project_manager"는 ProjectManagersController가 사용됩니다 - 그것은 ClientsController가 사용됩니다 아니라면. 그들은 모두에 로그인하지 않은 경우, ENV 사용자가 nil이 될 것입니다. '소장'] 당신은 아마 주위에 작업 할 수 있습니다, 그래서 당신은 오류가 발생합니다, 그러나 이것은 당신이 시작하는 것입니다.

  5. ==============================

    5.구현과 블로그 게시물 http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role/

    구현과 블로그 게시물 http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role/

  6. from https://stackoverflow.com/questions/4753871/how-can-i-redirect-a-users-home-root-path-based-on-their-role-using-devise by cc-by-sa and MIT license