2011-09-19 6 views
1

이 문제가 내 디자인에 대한 지식이나 문제로 인한 것인지 확실하지 않습니다.동일한 모델에 액세스하는 다른 컨트롤러에서 일부 유효성 검사 건너 뛰기

기본적으로 사용자가 로그인하여 기본 역할을 부여 받기를 원합니다. 나중에 이들은 "관리자"가되어이를 성취하기 위해 두 번째 가입 양식을 작성해야합니다.

그러나 표준 사용자와 관리자의 차이점은 데이터가있는 데이터의 측면에서는 매우 미약하지만 허용되는 사용 권한 측면에서는 매우 다릅니다. 따라서 두 개의 단일 사용자 모델을 사용하고 두 개의 다른 등록 양식과 결과 생성 요청을 제공하기 위해 두 개의 컨트롤러 인 users_controller와 managers_controller를 사용하기로했습니다. 이 상황을 처리하는 것은 잘못된 방법 일 수 있습니다.

이 모델에는 몇 가지 검증 설정이 있는데, 초기 등록 양식 (게스트가 users가 될 때 users_controller를 통해)에서 이러한 유효성 검증 중 일부가 실행되도록하고 나머지는 두 번째 가입 양식 (사용자가 관리자가되면 managers_controller를 통해)에서 시작됩니다. 그러나 예를 들어 validates_presence_of을 사용하면 두 가지 양식의 유효성을 검사하고 내가 정상적인 사용자에게 생년월일을 묻는 등의 불만을 제기합니다.

특정 작업에 대한 검사를 건너 뛰는 방법은 알고 있지만 다른 컨트롤러에 대해서는이 작업을 수행하는 방법을 알고 있습니까?

답변

4

유효성 검사는 모델 측에 있으므로 제어기에서 독립적입니다. BTW는 역할 기반 접근 방식에 대해 말하고있는 것으로 보입니다.

if 유효성 확인서를 사용하여 목표를 달성 할 수 있습니다.

validates :date_of_birth, :presence => true, :if => :manager? 

def manager? 
    # It actually depends on your design. 
    # You can use any authorization library. 

    self.role == "manager" 
end 

예를 들어 인기있는 것은 cancan입니다.

validates_presence_of :something, :if=>:manager? 

def manager? 
    self.manager 
end 

에 대해 또는 검증을 생략하기 위해 특별히 당신이

+0

와우 나는 당신이 그 일을 할 수 있을지 전혀 몰랐습니다. 훌륭한! 감사! –

1

사용자가 역할이 저장되는 일종의 속성 또는 연결이 있다고 가정합니다. validates_presence_of와 같은 레일에있는 모든 유효성 검사기는 : if 옵션을 통해 제공 한 Proc/Method가 true를 반환 할 때만 발사되는 방식으로 조건부 일 수 있습니다. 이러한 Proc 내에서 사용자가 실제로 "관리자"가 되려고하는지 확인 할 수 있습니다.

나는 최근에 특정 모델 인스턴스가있을 상태에 따라 유효성이 달라져야하는 유사한 문제가있었습니다. state_machine (http://github.com/pluginaweek/state_machine) 보석을 살펴보십시오. 이를 지원합니다. 아마 이것은 당신의 시나리오를 더 잘 어울립니다.

+0

재미있는 컨트롤러 중 하나에서

@user.save(false) 

을 할 수있는 방법 –

1

은, 나는 종종 상태 머신에 대해 궁금해했다. 들여다 볼만한 가치가있는 것 같습니다.
+0

모든 유효성 검사를 건너 뛰는 것은 좋지 않은 접근법입니다. 그렇게하지 않는 것이 좋습니다. – Voldy

관련 문제