2013-10-22 1 views
0

클래스로드하기 전에 방법을 실행 :나는 등 같은 조건 검증을 수행하고자하는 클래스 사용자가

if $organization.first_name_last_name 
    validates :name_first, presence: true, 
        length:  { maximum: 50 }, 
        :if => :local_authentication? 
    validates :name_last, presence: true, 
        length:  { maximum: 50 }, 
        :if => :local_authentication? 

그러나이 글로벌 조직 변수가 하위 도메인에 대한 특정 설정을 포함하는 객체이며 초기화를 응용 프로그램 컨트롤러의 before_filter에서.

class ApplicationController < ActionController::Base 
    before_filter :load_organization 
    ... 
    def load_organization 
     $organization = Organization.find_by_subdomain(request.subdomain).settings 
    end 

제 질문은 조직 변수가 올바르게 설정되도록 User 클래스가로드되기 전에 load_organization을 실행하는 방법입니다.

답변

1

사용자 클래스가 적어도 프로덕션 환경에서는 요청간에 다시로드되지 않기 때문에이 방법을 사용할 수는 없습니다.

유효성 검사에 이미 :if 매개 변수를 사용하고 있습니다. 다음과 같이 설정에도 사용할 수 있습니다.

validates :names_first, presence: true, 
         if: -> { 
          $organization.first_name_last_name && 
          local_authentication? 
         } 

BTW : 일반적으로 전역 변수를 사용하는 것은 잘못된 소프트웨어 디자인을 나타내는 기호입니다. 사용자가 속한 조직을 생성/업데이트하려고하지 않고 관계 getter를 통해 설정에 액세스 할 수 있습니까?

P.S .: 해시 구문도 혼합합니다. :foo => :bar 또는 foo: :bar을 사용해야하지만 둘 다를 동시에 사용해야합니다. 사실 나는 전혀 놀랍습니다;)

+0

답해 주셔서 감사합니다! 이것으로 해결했습니다. 아파트 젬 (https://github.com/influitive/apartment)을 사용하여 각 요청을 하위 도메인에 따라 다른 데이터베이스에서 처리 할 수 ​​있습니다. 멀티 임차를 가능하게하는 첫 번째 시도에서 각 인스턴스가 클라이언트의 필요에 따라 구성 매개 변수를 보유 할 별도의 조직 객체를 만들었습니다. 이것은 단지 일시적인 해결책 일뿐입니다. – rtemperv

관련 문제