2012-09-28 4 views
1

상황은 :레일 맞춤 이메일 검사기 | 블랙리스트

나는 블랙리스트 전자 메일 주소 목록에 의해 검증 될 필요가있는 사용자 모델을 얻었다. 블랙리스트에 전자 메일 주소가 추가 모델에있는이 블랙리스트라는

모델/user.rb :

class User < ActiveRecord::Base 
      validate :email_is_not_blacklisted 

      def email_is_not_blacklisted 
        @blacklist = Blacklist.where(:blacklist_type => "E-Mail") 

        @blacklist.each do |item| 
          errors.add(:email, 'is blacklisted') if self.email.match(item) 
        end 
      end 
    end 

모델/blacklist.rb

class Blacklist < ActiveRecord::Base 
      attr_accessible :name, :blacklist_type 

      #some validation code for blacklist items ... 
    end 

블랙리스트 항목의 예

#:  name,   blacklist_type 
    #1:  'demo-mail.com', 'E-Mail' 
    #2:  'test123.com', 'E-Mail' 

블랙리스트 모델은 앞으로 특정 사용자 이름을 금지하십시오!

문제 :

내 문제가 [시] 블랙리스트 항상 전무 것입니다. 내 논리에 문제가있을 수 있습니까? 다른 말로하면, 어쨌든 accosiation없이 다른 모델 내부의 모델에 액세스 할 수 있습니까?

사전에 도움을 주셔서 감사 드리며 기존 언어의 잘못에 사과드립니다. 나는 원어민이 아니다 :)

해답! 나는

errors.add(:email, 'is blacklisted') if self.email.match(item.name) 

가끔 내 머리는 내가 좋아하는 방식으로 ...

+0

흠 때문에 기본적으로는 User''내에서'Blacklist' 액세스 할 수 있습니다, 또는 당신은 ... 그러나'변경 시도 예외를 얻을 것 @ blacklist'을'blacklist'로 ... validat라고 생각합니다. ors는 인스턴스 메소드가 아닌 클래스 메소드로 호출됩니다 (따라서 인스턴스 변수는 없습니다) – mhutter

답변

2

class User < ActiveRecord::Base 
    validate :email_is_not_blacklisted 

    def email_is_not_blacklisted 
    if Blacklist.find_by_blacklist_type_and_name("E-Mail",self.email) 
     errors.add(:email, 'is blacklsited') 
    end 
    end 
end 

이 빨리 이전의 것들 다음 될 것

+0

그렇습니다, 나는 또한 이것이 더 빨리 작동한다고 생각하지만 블랙리스트는 차단 된 도메인 이름 만 포함 할 수 있습니다. 그래서 일치/정규식으로 확인해야합니다 = / – malcom

0

대소 문자 구분을 좋아하지 않는다 ... 항목의 속성이 사용되어야하는 정의 놓쳤다. 당신은 블랙리스트 형 = "전자 메일"과 예를 들어 데이터를 검색하는 것은 "전자 메일"

+0

이 실수로 죄송합니다! 데이터 일관성을 제공하기 위해 내 질문을 수정 :) 내 데이터베이스에서 blacklist_type은 내 where 조건과 동일합니다. – malcom

+0

'@ blacklist'는 (는) nil입니다. if 조건이 옳지 않은 것처럼 오류를 얻을 수 없습니다. – Yule

+0

고마워 친구 :) 항목의 속성을 사용해야한다고 선언하지 못했습니다 ... 내 오류가 발생하지 않습니다 ... 내 디버그 포인트가 너무 일찍 단계였습니다.- – malcom

0

내 의견에 확장하는 것입니다,이 시도 : 난 당신이 사용하는 것이 좋습니다 것입니다

class User < ActiveRecord::Base 
    validate :email_is_not_blacklisted 

    def email_is_not_blacklisted 
    Blacklist.find_all_by_blacklist_type("E-Mail").each do |item| 
     errors.add(:email, 'is blacklsited') if.self.email.match(item) 
    end 
    end 
end 
+0

문제가 해결되었지만 어쨌든 고맙습니다. – malcom