2010-02-16 3 views
19

전자 메일 및 암호 필드가있는 사용자 모델이 있습니다. 보안상의 이유로 이들은 서로 같지 않을 수 있습니다. 내 모델에서 이것을 어떻게 정의 할 수 있습니까?Rails 모델에서 두 값이 서로 동일하지 않음을 어떻게 확인합니까?

+0

다른 답변은 받아 들여지지 않은 이유는 이상합니다. –

+0

@Dejw 그것은 작동하는 가장 짧은 것입니다 –

+0

설명 주셔서 감사합니다.그럼에도 불구하고 klew의 대답은 짧습니다 ;-) –

답변

23

Create custom validataion을 : 모든 것은 여기에 포함된다. 해시를 보관해야합니다. authlogic 또는 Restful authentication과 같은 인증 플러그인을 사용해보세요. 여러 언어를 지원하려면

class User < ActiveRecord::Base 
    # ... 
    validates_with ValuesNotEqualValidator, fields: [:email, :password], msg: "This Person is evil" 
end 
6

사용자 지정 유효성 검사 방법을 사용하여이를 확인할 수 있습니다.

class User < ActiveRecord::Base 
    # ... 

    def validate 
    if (self.email == self.password) 
     errors.add(:password, "password cannot equal email") 
     errors.add(:email, "email cannot equal password") 
    end 
    end 
end 
1

는 당신이 필요로하는 모든 예를 들어 모델 에서 유효성 검사 규칙을 만드는 것입니다

class User < ActiveRecord::Base 
    def validate_on_create 
    if email == password 
     errors.add("password", "email and password can't be the same") 
    end 
    end 
end 
+1

나는 이것이 옳다고 생각하지 않는다. 우리는'validate_on_create'가 아닌'validate'를 원합니다. 왜냐하면 우리는 모든 저장시 전자 메일이 암호가 아니라 (생성시뿐만 아니라) 암호인지 확인해야하기 때문입니다. –

+0

오류 메시지에 구문 오류 (오타)가 있습니다. 작은 따옴표로 묶인 문자열에 작은 따옴표를 사용할 수 없습니다. –

4

그것은 암호가 저장되는 방법에 따라 달라집니다 암호 인 경우

class User < ActiveRecord::Base 
    validate :email_and_password_validation 

    def email_and_password_validation 
     if self.email == self.password 
      errors.add_to_base("Password must be different from email") 
     end 
    end 
end 

이 작동 것 문자 그대로 저장되어 있지만 이메일로 동일한 작업을 수행 할 수 있습니다 (예 : 해시 된 버전 생성). 예컨대 : 당신은 지정 유효성 검사 방법을 만들기에 관심이있을 수

class User < ActiveRecord::Base 
    validate :email_and_password_validation 

    def email_and_password_validation 
     if make_hash(self.email) == self.hashed_password 
      errors.add_to_base("Password must be different from email") 
     end 
    end 
end 

내 예는 http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002162

상황에서 가져 매우 일반적이다.

validate :check_email_and_password 

def check_email_and_password 
    errors.add(:password, "can't be the same as email") if email == password 
end 

를하지만 일반 텍스트로 암호를 저장하는 것은 좋은 생각이 있음을 유의하십시오 : http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-custom-validation-methods

+0

마지막 링크는 404 – Rekin

+0

고정 링크 (이전 버전의 레일스 가이드에서 가져옴)를 제공합니다. 감사. –

4

는 사용자 정의 유효성 검사기를 사용하는 것이 훨씬 현명 여기

class ValuesNotEqualValidator < ActiveModel::Validator 
    def validate(record) 
    if options[:fields].any? && options[:fields].size >= 2 
     field_values = options[:fields].collect { |f| record.send(f) } 
     unless field_values.size == field_values.uniq.size 
     record.errors[:base] << 
      (options[:msg].blank? ? "fields: #{options[:fields].join(", ")} - should not be equal" : 
       options[:msg]) 
     end 
    else 
     raise "#{self.class.name} require at least two fields as options [e.g. fields: [:giver_id, :receiver_id]" 
    end 
    end 
end 

사용 후 원하는 사용할 수있는 보편적 인 검증을위한 코드입니다 오류 메시지와 속성 이름을 변환하는 또 다른 솔루션을 생각해 내야합니다. 그래서 나는 그것을 위해 각각의 validator를 새로 만들었습니다.

validators/values_not_equal_validator.rb :

class User < ActiveRecord::Base 
    validates :forename, :surname, values_not_equal: true 
end 

그리고 나는이 같은 메시지를 번역 :

class ValuesNotEqualValidator < ActiveModel::EachValidator 
    def validate(record) 
    @past = Hash.new 
    super 
    end 

    def validate_each(record, attribute, value) 
    @past.each do |k, v| 
     if v == value 
     record.errors.add(attribute, I18n.t('errors.messages.should_not_be_equal_to') + " " + record.class.human_attribute_name(k)) 
     end 
    end 
    @past[attribute] = value 
    end 
end 

나는이 같은 모델에 전화

de: 
    activerecord: 
    attributes: 
     user: 
     forename: 'Vorname' 
     surname: 'Nachname' 
    errors: 
    messages: 
     should_not_be_equal_to: 'darf nicht gleich sein wie' 
4

새로운 방법 :

validates :password, exclusion: { in: lambda{ |user| [user.email] } } 

또는 :

validates :password, exclusion: { in: ->(user) { [user.email] } } 
+0

"새로운 길"이 의미하는 바를 분명히하십시오. 어떤 루비/레일이 적용됩니까? – oklas

+0

적어도 Rails 3.2.22/Ruby 2.2.6에서 작동했습니다 - 훌륭한 짧은 해결책. 감사. – oklas

관련 문제