전자 메일 및 암호 필드가있는 사용자 모델이 있습니다. 보안상의 이유로 이들은 서로 같지 않을 수 있습니다. 내 모델에서 이것을 어떻게 정의 할 수 있습니까?Rails 모델에서 두 값이 서로 동일하지 않음을 어떻게 확인합니까?
답변
Create custom validataion을 : 모든 것은 여기에 포함된다. 해시를 보관해야합니다. authlogic 또는 Restful authentication과 같은 인증 플러그인을 사용해보세요. 여러 언어를 지원하려면
class User < ActiveRecord::Base
# ...
validates_with ValuesNotEqualValidator, fields: [:email, :password], msg: "This Person is evil"
end
사용자 지정 유효성 검사 방법을 사용하여이를 확인할 수 있습니다.
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
는 당신이 필요로하는 모든 예를 들어 모델 에서 유효성 검사 규칙을 만드는 것입니다
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
나는 이것이 옳다고 생각하지 않는다. 우리는'validate_on_create'가 아닌'validate'를 원합니다. 왜냐하면 우리는 모든 저장시 전자 메일이 암호가 아니라 (생성시뿐만 아니라) 암호인지 확인해야하기 때문입니다. –
오류 메시지에 구문 오류 (오타)가 있습니다. 작은 따옴표로 묶인 문자열에 작은 따옴표를 사용할 수 없습니다. –
그것은 암호가 저장되는 방법에 따라 달라집니다 암호 인 경우
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
마지막 링크는 404 – Rekin
고정 링크 (이전 버전의 레일스 가이드에서 가져옴)를 제공합니다. 감사. –
는 사용자 정의 유효성 검사기를 사용하는 것이 훨씬 현명 여기
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'
:
- 1. 반환 값이 JS.Hash인지 어떻게 확인합니까?
- 2. XmlTextReader는 노드 값이 동일하지
- 3. 두 구성 요소의 값이 같은지 여부는 어떻게 확인합니까? JSF
- 4. 값이 벡터에 포함되어 있는지 어떻게 확인합니까? C++
- 5. 파이썬에서 공백 CSV 값이 작동하지 않음을 확인하십시오.
- 6. Rails 모델에서 "do"블록을 어떻게 실행합니까?
- 7. Rails - 조인 모델에서 레코드 값을 어떻게 업데이트합니까?
- 8. 어떻게 장고에서 두 모델 필드를 서로 비교합니까?
- 9. 로깅 핸들러 : 두 가지가 아닌지 어떻게 확인합니까?
- 10. Cucumber table.diff가 테이블이 동일하지 않다라고 말함 - Rails
- 11. PL/SQL 매개 변수 값이 기본값으로 설정되었는지 어떻게 확인합니까?
- 12. 저장하기 전에 양식의 어떤 값이 변경되었는지 어떻게 확인합니까?
- 13. PowerShell Cmdlet 매개 변수 값이 지정되었는지 어떻게 확인합니까?
- 14. JQuery를 사용하여 두 개의 입력 [텍스트] 값을 서로 어떻게 비교합니까?
- 15. 동일 값이 서로 같지 않습니까?
- 16. 사용자 지정 ValidationAttribute를 사용하여 두 속성이 일치하는지 어떻게 확인합니까?
- 17. Devise - 두 모델에서 로그인
- 18. rails check_box_tag 값이 NULL입니다.
- 19. 두 클래스를 서로 선언하십시오.
- 20. Telerik 그리드 게시 값이 Modelstate가 유효하지 않음을 나타냅니다.
- 21. OAuth 요청을 어떻게 확인합니까?
- 22. PHP에서 호스트를 어떻게 확인합니까?
- 23. SQLite3 구문을 어떻게 확인합니까?
- 24. 네트워크 연결을 어떻게 확인합니까?
- 25. 파일 형식을 어떻게 확인합니까?
- 26. 는 어떻게 확인합니까 1
- 27. 병합이 필요한지 어떻게 확인합니까?
- 28. IsolatedStorageFile이 있는지 어떻게 확인합니까?
- 29. PrintDialog.AllowCurrentPage의 값을 어떻게 확인합니까?
- 30. 302 응답을 어떻게 확인합니까?
다른 답변은 받아 들여지지 않은 이유는 이상합니다. –
@Dejw 그것은 작동하는 가장 짧은 것입니다 –
설명 주셔서 감사합니다.그럼에도 불구하고 klew의 대답은 짧습니다 ;-) –