복붙노트

[RUBY-ON-RAILS] 조건에 따라 경로를 레일

RUBY-ON-RAILS

조건에 따라 경로를 레일

나는 세 가지 역할이 있습니다 강사, 학생, 관리자 및 각은 "홈"뷰 컨트롤러가 있습니다.

그래서이 작품 벌금,

get "instructor/home", :to => "instructor#home"
get "student/home", :to => "student#home"
get "admin/home", :to => "admin#home"

나는 정확한 홈 페이지에 USER_ID의 역할을 기반으로하는 의지 경로를 아래와 같이 허영 URL을 작성합니다.

get "/:user_id/home", :to => "instructor#home" or "student#home" or "admin#home"

이걸 어떻게 수행합니까?

해결법

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

    1.정보가없는 라우팅 시스템이이 결정을 내리는 데 필요한 때문에 경로로이 작업을 수행 할 수 없습니다. 모든 레일은 요청이 점은 매개 변수가 무엇이며 데이터베이스에서 아무것도에 대한 액세스 권한이없는에서 알고있다.

    정보가없는 라우팅 시스템이이 결정을 내리는 데 필요한 때문에 경로로이 작업을 수행 할 수 없습니다. 모든 레일은 요청이 점은 매개 변수가 무엇이며 데이터베이스에서 아무것도에 대한 액세스 권한이없는에서 알고있다.

    당신이 필요로하는 것은 적절 redirect_to를 사용하여 필요한 어떤 데이터, 아마도 사용자 레코드 및 리디렉션을로드 할 수있는 제어 방법입니다.

    이 할 수있는 매우 표준 것입니다.

    최신 정보:

    하나의 컨트롤러 액션 내에서이 모든 것을 수행하려면 사용자 역할에 따라 논리를 분할해야합니다. 예는 다음과 같습니다

    class HomeController < ApplicationController
      def home
        case
        when @user.student?
          student_home
        when @user.admin?
          admin_home
        when @user.instructor
          instructor_home
        else
          # Unknown user type? Render error or use a default.
        end
      end
    
    protected
      def instructor_home
        # ...
        render(:template => 'instructor_home')
      end
    
      def student_home
        # ...
        render(:template => 'student_home')
      end
    
      def admin_home
        # ...
        render(:template => 'admin_home')
      end
    end
    
  2. ==============================

    2.레일 역할 기반 라우팅를 검색 할 때이 SO 질문은 상단에 올라 오는대로 나는 다른 접근 방식을 제공하고있다.

    레일 역할 기반 라우팅를 검색 할 때이 SO 질문은 상단에 올라 오는대로 나는 다른 접근 방식을 제공하고있다.

    나는 최근에 비슷한 구현하는 데 필요한하지만 컨트롤러에서 조건문의 큰 숫자를 피하기 위해 원 -이로드 및 제시 내 사용자 역할의 각각 완전히 다른 데이터를 요구한다는 사실에 의해 악화되었다. 나는 라우팅 제약을 사용하여 라우팅 레이어로 결정 논리를 이동하는 선택했다.

    # app/constraints/role_route_constraint.rb
    
    class RoleRouteConstraint
      def initialize(&block)
        @block = block || lambda { |user| true }
      end
    
      def matches?(request)
        user = current_user(request)
        user.present? && @block.call(user)
      end
    
      def current_user(request)
        User.find_by_id(request.session[:user_id])
      end
    end
    

    위의 코드의 가장 중요한 부분은 일치인가? 경로가 일치하는지 여부를 결정하는 방법. 상기 방법은 상기 요청이 이루어지는 영역에 대한 다양한 정보를 포함하는 요구 객체를 전달한다. 세션 쿠키에 저장 USER_ID 및 요청하는 사용자를 찾기 위해 그것을 사용 : 내 경우, 나는를 찾고 있어요.

    당신의 경로를 정의 할 때 다음이 제약 조건을 사용할 수 있습니다.

    # config/routes.rb
    Rails.application.routes.draw do
      get 'home', to: 'administrators#home', constraints: RoleRouteConstraint.new { |user| user.admin? }
      get 'home', to: 'instructors#home', constraints: RoleRouteConstraint.new { |user| user.instructor? }
      get 'home', to: 'students#home', constraints: RoleRouteConstraint.new { |user| user.student? }  
    end
    

    대신에 위 / 집에 요청 관리자가 AdministratorsController의 홈 조치를 라우팅 할 것으로,에 / 집으로 요청을하는 강사는 InstructorsController의 홈 조치로 라우팅 될 것이며, 학생에 요청 / home은 StudentsController의 홈 조치로 라우팅 될 것이다.

    좀 더 자세한 정보를 찾고 있다면, 나는 최근에 내 블로그에이 방법에 대해 썼다.

  3. from https://stackoverflow.com/questions/11230130/rails-routes-based-on-condition by cc-by-sa and MIT license