问题。OS X 10.9.5
使用gnupg 2.0.22:创建公钥/私钥
gpg -a --export > myKey .key.pub
gpg -a --export-secret-key myKey > .key.prv
这里可能发生了什么?我有一个带有ssn场的模型迁移添加为:
add_column :users, :ssn, :binary
用户模型
has_encrypted_column :ssn
为开发数据库添加了pgcrpyto扩展
在config/ininitializers/pgcrypto.rb 中
PGCrypto.keys[.public] = {path: '.key.pub'}
PGCrypto.keys[.private] = {path: '.key.prv',armored: true, password: 'myPassword'}
轨道c
User.create(username:'x',ssn:'123-45-6789')
得到这个错误,列是ssn,所以看起来它在做正确的事情
TypeError: wrong argument type Arel::Nodes::BindParam (expected String)
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `escape_string'
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `quote_string'
from ... /vendor/ruby/2.2.0/gems/pgcrypto-0.4.1/lib/pgcrypto/adapter.rb:51:in `pgcrypto_encrypt_string'
以下***是我认为错误所在的地方,但不确定在这里调用什么方法:找不到太多关于Arel::Nodes:BindParam的文档。我认为这应该将值设置为"123-45-6789",然后使用pgcrypto_encrypt_string调用对其进行加密。我确认钥匙是正确的。
57 def pgcrypto_insert(arel)
58 if table = PGCrypto[arel.ast.relation.name.to_s]
59 arel.ast.columns.each_with_index do |column, i|
60 if options = table[column.name.to_sym]
61 key = options[:key] || PGCrypto.keys[:public]
62 next unless key
63 # Encrypt encryptable columns
64 ***** value = arel.ast.values.expressions[i]
65 arel.ast.values.expressions[i] = pgcrypto_encrypt_string(value, key)
66 end
67 end
68 end
69 end
非常感谢任何指点。当发现后,很乐意分叉并进行拉取请求。
猜测是由于Rails 4.2.0 中的Arel 6.0
轨道4.1.0、Arel 5.0
Arel::Nodes::BindParams < Arel::Nodes::SqlLiteral < String < Object < BasicObject
轨道4.2.0 Arel 6.0
Arel::Nodes::BindParams < Arel::Nodes::Node < Object < BasicObject
关于如何从Arel::Nodes::Node 中提取值的任何提示