2014-06-22 3 views
0

저는 이것이 간단한 문제라고 생각합니다. 지금까지 나는 사용자 모델을위한 새로운 발판을 만들기 위해 레일에서 새로운 사용자 생성시 입력 매개 변수를 수정하는 방법 (저장됩니다)?

rails generate scaffold User username:string email:string password:string

를 실행했습니다. 다음은 내 user.rb입니다 :

class User < ActiveRecord::Base 
    validates :username, presence: true, length: { in: 2..50 }, uniqueness: true 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: true 
    validates :password, presence: true, length: { in: 4..50} 

    #self.password = 'abcd' #I can't even change the parameter to something hard-coded! 
end 

나는 몇 가지 검사를 서면으로 작성했습니다, 그 위대한 작품. 다음 단계는 해시 함수를 통해 password 매개 변수를 넣고 (교육용으로 직접 작성하려는) 원본 문자열 대신 새로 수정 한이 문자열을 저장하는 것입니다. 나는 이것을하는 방법을 이해하지 못하는 것입니까? create 방법으로 users_controllers.rb에서 호출되는 user.rb에 메소드를 생성합니까?

rails console --sandbox을 수행하고 테스트를 작성하여 테스트하고 싶습니다.

답변

2

당신은 암호를 여러 번 해시하지 당신은이 방법에주의해야하는 before_save 콜백

# user.rb model 

before_save :hash_password 

def hash_password 
    self.password = some_hash_function(self.password) 
end 

를 사용할 수 있습니다. 즉, 해시 된 버전을 해시하지 않고 항상 명확한 암호를 해시해야합니다. 그래서 내가 이런 식으로하고 password_digest 필드를 호출하고 암호 특성이 설정된 경우에만 암호를 해시합니다.

# user.rb model 

attr_accessor :password 
before_save :hash_password 

def hash_password 
    self.password_digest = some_hash_function(self.password) unless self.password.blank? 
end 

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

은 그래서 내 사용자 테이블은 열은'password' 또는'password_digest'라는 것? 그리고 내가 콘솔에서 놀고있을 때'User.new (..., password : "pass")'또는'User.new (..., password_hash : "pass")'를해야합니까? 감사. – bourbaki4481472

+0

테이블에는 password_digest 만 있지만 모델에는 암호도 있습니다. 따라서 사용자가 양식의 암호 텍스트 필드를 채우면 암호 속성을 해당 값으로 설정 한 다음 해당 값에 해시 매직을 수행합니다. – Iceman

+0

그게 내가 생각한거야,하지만 어떻게 사용자가'password_digest'를 통과시키지 못하게 할 수 있습니까? – bourbaki4481472