Вы можете воспроизвести проблему следующим образом:
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
проблема в том, что атрибуты установлены влево -> вправо и: пароль зависит от: ключ, поэтому когда: пароль перед: ключ, ключ равен nil.
Вот почему это зависит:
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
Я думал, может быть, просто зашифровать атрибут при сохранении в базе данных, но проблема в том, что может быть много зашифрованных атрибутов, а также некоторые люди могут использовать зашифрованный атрибут перед сохранением.Что я могу сделать, чтобы предотвратить это?Кто-нибудь хочет добавить запрос на вытягивание ???