2011-12-16 6 views
3

Вы можете воспроизвести проблему следующим образом:Attr_encrypted порядок атрибутов в ActiveRecord

git clone -b args_order git://github.com/danpal/attr_encrypted.git 
cd attr_encrypted/ 
rake test 

1) Error: 
test_should_create_an_account_regardless_of_arguments_order(ActiveRecordTest): 
ArgumentError: must specify a :key 

Вот что тест:

def test_should_create_an_account_regardless_of_arguments_order 
    Account.create!(:key => "secret", :password => "password") 
    Account.create!(:password => "password" , :key => "secret") 
end 

проблема в том, что атрибуты устанавливаются слева -> правый и: пароль зависит от: key, поэтому, когда: пароль до: ключ, ключ равен нулю.

Вот почему это зависит:

class Account < ActiveRecord::Base 
    attr_accessor :key 
    attr_encrypted :password, :key => Proc.new {|account| account.key} 
end 

так, если account.key не установлен перед: пароль установлен вещи ломаются.

Сейчас я шифровать значение каждый раз, когда значение атрибута, который должен быть зашифрован установлено:

define_method("#{attribute}=") do |value| 
    ..... 
    send("#{encrypted_attribute_name}=", encrypt(attribute, value)) <---HERE GETS ENCRYPTED 
    instance_variable_set("@#{attribute}", value) 
end 

Я думал, может быть, просто зашифровать атрибут при сохранении в базу данных, но проблема заключается в том, что может быть много зашифрованных атрибутов, а также некоторые люди могут использовать зашифрованный атрибут до сохранения . Что я могу сделать, чтобы предотвратить это? кто-нибудь хочет добавить запрос на тягу ???

+0

Я столкнулся с этой же проблемой. Вы когда-нибудь разрешали? – maletor

ответ

2

Я изменил свою модель, чтобы справиться с этим:

attr_encrypted: ПЛА,: ключ => Rails.env.test? ? 'ssn_secret': ENV ['SSN_SECRET']

Смежные вопросы