[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.정보가없는 라우팅 시스템이이 결정을 내리는 데 필요한 때문에 경로로이 작업을 수행 할 수 없습니다. 모든 레일은 요청이 점은 매개 변수가 무엇이며 데이터베이스에서 아무것도에 대한 액세스 권한이없는에서 알고있다.
정보가없는 라우팅 시스템이이 결정을 내리는 데 필요한 때문에 경로로이 작업을 수행 할 수 없습니다. 모든 레일은 요청이 점은 매개 변수가 무엇이며 데이터베이스에서 아무것도에 대한 액세스 권한이없는에서 알고있다.
당신이 필요로하는 것은 적절 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.레일 역할 기반 라우팅를 검색 할 때이 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의 홈 조치로 라우팅 될 것이다.
좀 더 자세한 정보를 찾고 있다면, 나는 최근에 내 블로그에이 방법에 대해 썼다.
from https://stackoverflow.com/questions/11230130/rails-routes-based-on-condition by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레이크 dB 대 마이그레이션 : 마이그레이션 DB 레일 (0) | 2020.02.20 |
---|---|
[RUBY-ON-RAILS] 어떻게 MySQL의 데이터베이스에 중복 레코드를 삭제하려면? (0) | 2020.02.20 |
[RUBY-ON-RAILS] RSpec에와라는 이름의 경로 (0) | 2020.02.20 |
[RUBY-ON-RAILS] 조건을 가진 열에 대한 카운터 캐시? (0) | 2020.02.20 |
[RUBY-ON-RAILS] 액티브 :: 자료에 대한 정의되지 않은 방법 raise_in_transactional_callbacks = ': 클래스 (NoMethodError) (0) | 2020.02.20 |