레일

2017-11-22 12 views
0

대신 전체 컨트롤러 액션의 개별 레코드에 대한 권한을 제한 I 카테고리레일

class Article < ApplicationRecord 
    belongs_to :category 


class Category < ApplicationRecord 
    has_many :articles, dependent: :destroy 

그것은 내가 어떤 롤 자신의 인증 및 권한 부여와 기본 사용자 모델을하지만이에 속하는 기사와 레일 응용 프로그램이 특정 사용자를 특정 카테고리의 기사로 제한하려는로드 블록으로 실행

"admin"사용자와 "internal"사용자가 있습니다.

내가 범주 만 관리 및 내부 사용자에 내부로 설정되어있는 기사에 대한 액세스를 제한 할 수

로 내부라는 카테고리가 있습니다.

일반 사용자 또는 로그인하지 않은 사용자가 내부 카테고리의 기사에 액세스하려고하면 홈 페이지로 리디렉션되고 액세스가 거부되었음을 알리는 플래시 메시지가 표시됩니다.

내가보기 싫은 특정 페이지는 카테고리가 내부로 설정된 기사와 내부 카테고리에 대한 표시 페이지의 모든 기사에 대한 표시 페이지입니다.

내부 카테고리의 표시 페이지는 범주가 내부로 설정된 모든 기사를 반복합니다.

이미 before_action을 사용하여 새 페이지의 편집 및 삭제 페이지에 대한 무단 액세스를 제한하도록 설정했습니다. 대신 전체 컨트롤러 액션의 모델에서 개별 레코드에 대한 액세스를 제한하는보다 세밀한 방법은

before_action :admin_user,  only: [:new, :edit, :destroy] 

def admin_user 
     redirect_to(root_url) && flash[:danger] = "You are not authorized!" unless current_user.admin? 
    end 

내 주요 질문은 것입니까?

나는 cancancan과 같은 몇 가지 보석을 파 냈다. 그러나 모든 것들은 개인적인 기록이 아닌 전체 컨트롤러 행동에 대한 접근을 제한하는 것에 초점을 맞추는 것처럼 보인다.

모든 의견을 크게 기뻐할 것입니다.

답변

0

나는이 일을 끝내기위한 방법을 찾지 못했지만, 내 코드가 추악하고 그것을 정리하고 더 우아하게 만들 수있는 제안을 할 것이라고 확신한다. 나는 그것이 미래에 누군가를 돕는 경우에 대비하여 내 대답을 게시 할 것이라고 생각했습니다.

사용자가 보려는 기사를 검사하는 기사 컨트롤러에서 before_action을 추가하고 카테고리가 "내부"로 설정된 경우 내부 사용자 인 경우에만보기를 허용합니다. 내부에 있지 않으면 편집에서 제외됩니다.

사용자 모델에는 사용자를 내부로 설정하는 부울이 있습니다.

before_action :internal_article, only: [:show, :edit] 

def internal_article 
    @article = Article.find(params[:id]) 
    if @article.category.name == "Internal" 
    redirect_to(root_url) && flash[:danger] = "You are not authorized to view that article!" unless logged_in? && current_user.internal? 
    end 
end 
0
당신은 컨트롤러에이이 방법을 사용하여 모델

def self.non_internal 
    where(category: Category.where.not(name: 'internal')) 
end 

당신의 기사에 투입이 클래스의 방법으로 할 수

@article = Article.non_internal.find(params[:id]) 
if @article.nil? 
    redirect_to(root_url) && flash[:danger] = "You are not authorized to view that article!" unless logged_in? && current_user.internal? 
end