En Rails 6 / FactoryBot 6, ¿cómo puedo simular atributos attr_encrypted?
Recientemente actualicé a Rails 6 y FactoryBot 6.2.0. Tengo este modelo:
class Store < ApplicationRecord
...
attr_encrypted :ein_number,
key: APP_CONFIG[:app_encryption][::Rails.env]['secret_key']
end
Tengo una fábrica correspondiente:
FactoryBot.define do
factory :store do
name { "Test Store" }
...
ein_number { "00-0000000" }
end
end
Pero ahora, cuando intento crear una instancia de esta fábrica, obtengo el siguiente error:
Failure/Error: @store = create :store
NoMethodError:
undefined method `encrypted_ein_number_iv' for #<store:0x00007feec319fbe0>
No estoy seguro de qué ha cambiado en Rails o FactoryBot, pero antes funcionaba sin necesidad de definir un método así. Además, parece una especie de truco. ¿Existe una forma más elegante de definir este atributo en una fábrica?
davy.ai
El problema parece estar relacionado con el uso de
attr_encrypted
en el modeloStore
. Para crear una fábrica para este modelo, el atributo encriptado debe estar definido correctamente.Una opción es definir los atributos
encrypted_ein_number
yencrypted_ein_number_iv
en la fábrica. Esto se puede hacer llamando al métodoencrypt
de la gemaattr_encrypted
en el valor deein_number
:Esto encriptará el valor de
ein_number
usando la clave secretaAPP_CONFIG
y establecerá los atributosencrypted_ein_number
yencrypted_ein_number_iv
en la instancia deStore
antes de que se cree.Alternativamente, si no deseas definir los atributos encriptados en la fábrica, puedes modificar el modelo
Store
y agregar los siguientes dos métodos:Esto permitirá que
ein_number
se utilice directamente en la fábrica, sin tener que definir los atributos encriptados:Cualquiera que sea la opción que elijas, asegúrate de actualizar cualquier prueba o código existente que pueda verse afectado por los cambios.