2017-12-29 85 views
0

개체의 user_id가 관리자가 아닌 계정과 연결되어 있으면 새 레코드 개체를 유효하지 않게하려고합니다.레일즈는 모델로부터 admin 레코드를 생성하는 사용자의 유효성을 검사 할 수 있습니까?

모델에서 user_id.admin == true로 만들 개체가 유효성 검사를하고 싶습니다. 나도 이러한 솔루션의

작동 :

validates :user_id, User.find(:user_id).admin? 

    before_save :user_is_admin, User.find(self.user_id).admin? 

그래서, 내 질문은, 나는 그들이 관리자 경우 사용자와 수표를 조회하고, 오류가 발생합니다 유효성 검사를 쓰기 어떻게 그렇지 않은 경우 ?

P. 나는 이미 before_action으로 컨트롤러에서 관리자 검사를하고 있지만 관리자가 아닌 사용자가 어떻게 든 하나를 생성하고 테스트 목적으로 관리한다면 객체를 무효화하고 싶습니다.

이것이 최선의 방법이 아니라면 레일에서 유효성 검사를 만드는 방법에 대해 더 알고 싶습니다.

답변

1

일반적으로 모델/데이터베이스 수준에서 이러한 유형의 권한 부여를 권장하지는 않습니다. 오히려 나는 자신의 레이어에 자신의 권한 부여 코드를 추상화하고 컨트롤러 레벨에서이 코드를 처리 한 다음 컨트롤러를 통하지 않고는 아무도 객체를 만들 수 없는지 확인하는 테스트에 의존 할 것을 제안합니다.

https://github.com/elabs/pundit은 Rails 애플리케이션에 인증 레이어를 통합하기위한 훌륭한 보석입니다. 조치가 모델로 이동하기 전에 대부분의 유효성을 검사

validate :creator_is_admin 

def creator_is_admin 
    errors[:base] << I18n.t('object_class.activerecord.validations.admin_create_check_failure') unless User.find(user_id).try(:admin?) 
end 
+0

흠. 모델에서 잘 작동하는 것처럼 보입니다. 내가 디버그 할 수 있고 사용자를 조회 할 수 있지만 잘못된 사용자를 찾고 있습니다. 테스터가 아무도 발견하지 못했을 때 "ActiveRecord :: RecordNotFound : 'id'= app/models/post.rb : 12 :'creator_is_admin '에서 test/models/post_test.rb : 17 :'블록 내의 ' " 나는 올바른 방법으로 해결해야 할 것 같다. :) – Jeremy

0

, 컨트롤러는 그것을위한 좋은 수 있습니다 : 당신은 여전히 ​​모델 수준에서이 검증을하고 싶지 않은 경우

, 당신이 뭔가를 할 수 있습니다.

###Post Model Sample 

    validate :is_admin? 
    def is_admin? 
    unless User.find_by_id(user_id).admin 
     errors.add(:not_admin, "The post not belongs to you || not admin :) ") 
    end 
    end