如何在rails中创建新用户时修改输入参数(然后保存)?

时间:2014-06-22 17:39:53

标签: ruby-on-rails ruby sqlite scaffolding

我认为这是一个简单的问题。到目前为止,我已经

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

为User模型创建一个新的脚手架。以下是我的user.rb

class User < ActiveRecord::Base
    validates :username, presence: true, length: { in: 2..50 }, uniqueness: true
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[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参数放入一个哈希函数(我想自己编写用于教育目的)并保存这个新修改的字符串而不是原始字符串。我似乎不明白该怎么做?我是否在user.rb中创建了一个方法,该方法是从users_controllers.rb方法下的create调用的?

我想通过执行rails console --sandbox并编写一些测试来测试这一点。

1 个答案:

答案 0 :(得分: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