Module: Skr::Concerns::LockedFields::ClassMethods

Defined in:
lib/skr/concerns/locked_fields.rb

Instance Method Summary collapse

Instance Method Details

#has_locks(*locks) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/skr/concerns/locked_fields.rb', line 49

def has_locks( *locks )
    locks.each do | lock |
        define_method( "unlock_#{lock}" ) do | &block |
            instance_variable_set "@_lock_#{lock}_unlocked", true
            block.call
            remove_instance_variable "@_lock_#{lock}_unlocked"
        end
        define_method( "is_#{lock}_unlocked?") do
            instance_variable_defined? "@_lock_#{lock}_unlocked"
        end
    end
end

#locked_fields(*flds) ⇒ Object

Mark fields as locked, meaning they cannot be updated by using the regular attribute update methods. Instead it must be called in an unlock block Relies on attr_readonly internally

Is used to designate sensitive fields that we want to make sure someone’s thought about before updating Also solves the age old single equals vs double equals bug/typo.

   class BankAccount < Skr::Model

   end

   bank=BankAccount.find(1)
   b.mark_as_super if bank.account_balance = 42 # a bit contrived, but you get the idea
   b.save # oops, what's our balance now?

Now let's try it again with locked_fields

   class BankAccount < Skr::Model
       attr_readonly :account_balance
   end

   bank=BankAccount.find(1)
   b.mark_as_super if bank.account_balance = 42
   b.save # Still not ideal since we marked the bank as super, but at least our balance is ok

To update the balance we'd need to:

   b.unlock_fields( :account_balance ) do
       b.account_balance += 33
   end
   b.save

This is still a bit contrived since we'd actually have
an audit logger that would be involved and it'd be inside a transaction.


44
45
46
47
# File 'lib/skr/concerns/locked_fields.rb', line 44

def locked_fields( *flds )
    include InstanceMethods
    attr_readonly( *flds )
end