2012-04-24 2 views
0

그냥 궁금. 그러나 사용자가 프로젝트에 액세스 할 수있는 경우 사용자는 해당 프로젝트에 속한 모든 목록과 항목에 액세스 할 수 있습니다.레일 : 중첩 된 리소스/모델에 영향을 미치는 메소드를 정의하는 마른 방법이 있습니까?</p> <p>특정 사용자가 특정 프로젝트에 액세스 할 수</p> <p>나열 has_many 항목</p> <p>사용자 has_many 프로젝트</p> <p>프로젝트 has_many 목록 : 다음을 수행 할 수있는 더 좋은 방법이 있다면

def check_for_user_access(resource, resource_class, user) 
    case resource_class 
    when 'Project' 
     if resource.user == user 
     return true 
     end 
    when 'List' 
     if resource.project.user == user 
     return true 
     end 
    when 'Item' 
     if resource.list.project.user == user 
     return true 
     end 
    else 
     return false 
    end 
end 

내가 액세스 이후 목록 및 항목의 USER_ID 속성을 원하지 않았다가 정말 프로젝트에 묶여 :

는 여기에 내가 정리할 방법입니다.

약간 다른 비교를 둘러 보려면 switch 문을 사용하는 것보다 더 좋은 방법이 있습니까?

미리 감사드립니다.

답변

1

아마도이 작업을 수행하는 더 간단한 방법은 allow_access를 정의하는 것입니다. 그 자원 클래스의 각 방법 - 모든 컨트롤러가 수행하는 사용자의가 허용하는 경우 리소스를 요청할 예를 들어 :

:

선택적으로
class Project < ActiveRecord::Base #I assume 
    def allow_access?(user) 
    return self.user == user 
    end 
end 

class List < ActiveRecord::Base 
    def allow_access?(user) 
    return self.project.user == user 
    end 
end 

class Item < ActiveRecord::Base 
    def allow_access?(user) 
    return self.list.project.user == user 
    end 
end 

그리고는, 당신의 사용자 모델에 래퍼를 넣어.

class User < ActiveRecord::Base 
    def can_access?(resource) 
    resource.allow_access?(self) 
    end 
end 

그리고 당신의 방법은 당신이 물건을 조금 강화하고자한다면

user.can_access?(resource) 

로 대체 할 수 있습니다, 귀하의 사용자 모델은 자원이 allow_access에 응답 있는지 확인 수 있을까? ...

+0

감사합니다 ... 완벽합니다. –

+0

당신은 환영합니다 :) – andrewdotnich

0

두 가지 : 그들은 단지 하나의 사용자에 속할 수 있습니다 것 같습니다 이후

1), 나는 목록 및 항목에 belongs_to :user을 추가하는 것을 고려 할 상황을 감안할 때.

목록 및 항목 모델에서이 내용을 복제해도 아무런 해가 없으며 앱의 특정 객체가 누구인지를 확인할 수있는 매우 간단한 방법을 제공합니다.

2) CanCan을 확인해야합니다. 그것은 당신이 다루는 것처럼 사물에 대한 액세스를 규제하도록 설계된 매우 간단하고 가벼운 Authorization 라이브러리입니다.

+0

정보가 분리되어 (즉, 프로젝트가 한 사용자에게 속하고 그 목록 중 하나가 다른 사용자에게 속하는) 시나리오로 이어질 수 있으므로 다른 belongs_to를 추가하는 것이 걱정됩니다. 그것은 일어나서는 안되지만 그것을 확인하고 싶지는 않습니다. CanCan에 대한 제안에 감사드립니다. 나는 실제로 그것에 대한 능력 규칙을 쓰려고했지만, 내가 그것에 대해 알지 못했다면 그 팁이 도움이되었을 것이다. 그것은이 같은 생명의 은인입니다. 의견을 보내 주셔서 감사합니다. –

+0

FWIW를 사용하면 '분리 된'것이 아닌지 쉽게 확인할 수 있지만 좋아하는 솔루션을 발견하게되어 기쁩니다. – Andrew