2014-01-29 2 views
0

시나리오 : 레일즈 시스템에 액세스 제어 목록을 통해 모두 제어해야하는 몇 가지 ActiveRecord 모델이 있습니다. 나는 내가 원하는 것을 수행하는 멋진 작은 ACL 구현을 가지고 있지만, 현재 체크 - 액세스 호출은 각각의 제어 된 객체 유형 (문서, 사용자 등)에 모두 복제되어있다.루비 모듈이 혼합 된 클래스 메서드 호출하기

내 직감은 공유 코드를 모듈로 가져 와서 믹스 인으로 사용하는 것입니다. 혼성 모듈이 ActiveRecord :: Base 메소드를 호출했기 때문에 이것이 가능한지 (또는 올바른 구문이 무엇인지) 확신 할 수 없다. scope와 has_many 정의가있다.

class Document < ActiveRecord::Base 
    include Controlled 
end 

module Controlled 
    has_many :acls, as: :controlled 
    scope :accessible, ->(uid, level){where("BUNCH OF SQL HERE")} 
    def access_convenience_methods 
    #stuff to provide easy access to authorization checks 
    end 
end 

그리고 나는 제어 등이 액티브 :: 자료에서 파생 몇 가지 다른 모델이있을 것이다 :

내가 달성하고 싶은 무엇의 예

는 여기에있다.

모듈에서 has_many 및 scope 호출이 발생하여 혼성 모듈에서 호출 할 수 없습니다. 분명히이 컨텍스트는 외부 클래스 메서드에 액세스 할 수 없습니다.

어떤 조언을 환영합니다.

답변

2

그런 모듈에서 클래스 메서드를 호출 할 수 없다는 점에서 맞습니다.

요즘에는이를 수행하는 데 필요한 상용구 코드가 ActiveSupport::Concern으로 싸여 있습니다. 그것은 당신이 원하는 것을 정확하게합니다.

[편집] the boilerplate code itself도 꽤 짧고 읽기 쉽고 메타 메타 프로그래밍의 좋은 예로서 공부해야한다고 제안합니다.

0

아하 이것은 분명히 루비 초보자 실패한 것입니다. has_many와 다른 일회용 호출을 포함 된 블록 안에 넣어야합니다. ActiveSupport :: Concern은 정확히 여기에서 사용할 올바른 것 같습니다 :

module Controlled 
    extend ActiveSupport::Concern 
    included do 
    has_many :acls, as: :controlled 
    scope :accessible, ->(uid, level){where("BUNCH OF SQL HERE")} 
    end 
    def access_convenience_methods 
    #stuff to provide easy access to authorization checks 
    end 
end 
관련 문제