Виртуальный атрибут не устанавливается до того, как 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
Другие вопросы по тегам