您可以按照以下方式重现该问题:
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
问题是属性设置在左边 - >正确和:密码取决于:密钥所以当:密码是之前:密钥,密钥是零。
这就是为什么它取决于:
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 :(得分:2)
我修改了我的模型以解决这个问题:
attr_encrypted:ssn,:key =&gt; Rails.env.test? ? 'ssn_secret':ENV ['SSN_SECRET']