<-- home

Rails 虚拟属性

虚拟属性就是数据表中不存在的属性。

像PHP,在提交表单的时候,要想让提交的字段直接保存到数据库,就要保证数据库里有对应的字段,例如

<input type="password" name="password" />

后端接收password,然后计算salt,将password和salt组合获取password_digest再存入数据库。

因此针对password,就没办法和表单中其他数据库已经存在的属性一起,放在数组里直接插入数据库,因为数据库里没有password字段。

在Rails中,可以在model里使用虚拟属性,例如在user.rb中

def password
  @password
end

def password=(password)
  @password = password
  generate_password(password)
end

def generate_password(password)
  salt = Array.new(10) { rand(1024).to_s(36) }.join
  self.salt, self.password_digest =
      salt, Digest::SHA256.hexdigest(pass + salt)
end

使用user.password = ‘newpassword’

调用user.password会返回用户的password,即’newpassword’

在提交保存或者更新password的时候,会调用password=这个方法,将model的真实属性salt和password_digest进行赋值。

这样的话,就可以把password直接做为提交参数,对model进行操作了。