你如何使用attr_encrypted的灯具

Reg*_*ieB 5 activerecord ruby-on-rails fixtures minitest attr-encrypted

我想测试一个使用attr_encrypted加密数据库中的秘密的模型

class Thing
  attr_encrypted :secret, encode: true
end
Run Code Online (Sandbox Code Playgroud)

但是当我在灯具中定义秘密时,编码的换行符会被转义出来.

one:
  encrypted_secret: '<%= Thing.encrypt_secret(SecureRandom.uuid) %>'
Run Code Online (Sandbox Code Playgroud)

那是:

'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC\nm6qD\n'
Run Code Online (Sandbox Code Playgroud)

存储在数据库中:

'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC
 m6qD'
Run Code Online (Sandbox Code Playgroud)

这样做的问题是失败了:

thing = things(:one)
assert_equal thing, Thing.find_by_secret(thing.secret)
Run Code Online (Sandbox Code Playgroud)

Thing.find_by_secret(thing.secret)返回nil,因为生成的SQL查询尝试匹配加密机密的两个版本并且无法获得匹配.

我试过了:

one:
  encrypted_secret: 'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC\nm6qD\n'
Run Code Online (Sandbox Code Playgroud)

但得到相同的结果.

如何配置我的灯具以使用attr_encrypted?

Reg*_*ieB 0

有效的解决方案是将所有 '\n' 替换为 '\\n' 并使用双引号。这有效:

one:
  encryped_secret: "<%= Thing.encrypt_secret(SecureRandom.uuid).gsub(/\n/, '\\\\n') %>"
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的方法来做到这一点?