Виртуальный атрибут не устанавливается до того, как attr_encrypted использует указанный виртуальный атрибут для ключа шифрования
Когда encryption_key
называется attr_encrypted
, :passphrase
не был установлен. Ключ шифрования в конечном итоге становится хешем соли sha1; это должен быть sha1 хэш парольной фразы и соли.
Соль генерируется при создании и сохраняется в базе данных.
Как я могу использовать :passphrase
виртуальный атрибут в ключе шифрования?
Какие-либо предложения?
Для краткости я опустил кучу кода.
class Employee < ActiveRecord::Base
require 'digest/sha1'
attr_accessor :passphrase, :ssn
attr_accessible :passphrase, :ssn
attr_encrypted :ssn, :key => proc { |employee| "#{employee.encryption_key}" }
def encryption_key
unless salt?
self.salt = Digest::SHA1.hexdigest(generate_salt)
end
Digest::SHA1.hexdigest([passphrase, self.salt].join)
end
end
class EmployeesController < ApplicationController
def create
@employee = @parent.employees.new(params[:employee])
if @employee.save
redirect_to @parent
else
render action: "new"
end
end
end
Заранее спасибо!
1 ответ
Решение
Попробуйте установить ssn после ключевой фразы и других атрибутов
class EmployeesController < ApplicationController
def create
ssn = params[:employee].delete(:ssn)
@employee = @parent.employees.new(params[:employee])
@employee.ssn = ssn
if @employee.save
redirect_to @parent
else
render action: "new"
end
end
end