Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rails中创建新用户时修改输入参数(然后保存)?_Ruby On Rails_Ruby_Sqlite_Scaffolding - Fatal编程技术网

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

Ruby on rails 如何在rails中创建新用户时修改输入参数(然后保存)?,ruby-on-rails,ruby,sqlite,scaffolding,Ruby On Rails,Ruby,Sqlite,Scaffolding,我认为这是一个简单的问题。到目前为止我已经跑了 rails生成脚手架用户用户名:string电子邮件:string密码:string 为用户模型创建新的脚手架。以下是我的user.rb: class User < ActiveRecord::Base validates :username, presence: true, length: { in: 2..50 }, uniqueness: true VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-

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

rails生成脚手架用户用户名:string电子邮件:string密码:string

为用户模型创建新的脚手架。以下是我的
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
class用户
我写了一些测试,效果很好。我的下一步是将
password
参数通过hashfunction(出于教育目的,我想自己编写该函数),并保存这个新修改的字符串,而不是原始字符串。我好像不明白怎么做?我是否在
user.rb
中创建一个方法,该方法从
create
方法下的
users\u controllers.rb
调用


我想通过做
rails控制台--sandbox
并编写一些测试来测试这一点

您可以使用“保存前”回调

# user.rb model

before_save :hash_password

def hash_password
  self.password = some_hash_function(self.password)
end
使用此方法时必须小心,不要多次散列密码。也就是说,您必须始终哈希清除密码,而不是哈希版本。这就是为什么我会这样做,并调用字段password_digest,仅在设置password属性时对密码进行散列

# 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

那么,我的用户表是否会有一个名为
密码
密码摘要
的列?当我在控制台中玩的时候,我应该做
User.new(…,password:“pass”)
还是
User.new(…,password:“pass”)
?谢谢。您的表将只包含密码摘要,但模型也将包含密码。因此,当用户在表单中填写密码文本字段时,您可以将password属性设置为该值,然后对该值执行哈希魔法。这就是我的想法,但如何防止用户传递
密码摘要
?使用强参数,您只需在其中不包含
密码摘要