0

I have the following so far

class User < ApplicationRecord
  def name=(s)
    super s.encrypt
  end
  def name
    (super || '').decrypt
  end

I would like to replace it and do something like

@@encrypted_fields = [:name, :phone, :address1, ...]
def self.initialize
  @@encrypted_fields.each do |s|
    setter = (s.to_s+'=')(value) -> do
      super value.encrypt
    end
    getter = (s.to_s) -> do
      (super || '').decrypt
    end
    User.send(:include, setter)
    User.send(:include, getter)
  end
end

I can't do this for all the records, like email, of course (how will they log in?), and some fields aren't important enough to bother.

I tried

  @@encrypted_fields = [:name, :phone, :address1]
  @@encrypted_fields.each do |m|
    setter = (m.to_s+'=').to_sym
    getter = m
    define_method(setter) do |v|
      super v.encrypt
    end
    define_method(getter) do
      (super || '').decrypt
    end
  end

based on Use def_method inside ActiveRecord model

but it gave

implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly.
(super || '').decrypt

Chloe
  • 25,162
  • 40
  • 190
  • 357

0 Answers0