card/lib/card/director/all.rb
class Card
class Director
# director-related Card instance methods
module All
attr_writer :director
delegate :validation_phase, :storage_phase, :integration_phase,
:validation_phase_callback?, :integration_phase_callback?, to: :director
def director
@director ||= Director.fetch self
end
def prepare_for_phases
reset_patterns
include_set_modules
end
def identify_action
@action =
if trash && trash_changed?
:delete
elsif new_card?
:create
else
:update
end
end
def act options={}, &block
if act_card
add_to_act options, &block
else
start_new_act(&block)
end
end
def act_card
Card::Director.act_card
end
def act_card?
self == act_card
end
def save! **args
as_subcard = args.delete :as_subcard
act(as_subcard: as_subcard) { super **args }
end
def save *_args
act { super }
end
def valid? *_args
act(validating: true) { super }
end
def update *_args
act { super }
end
def update! *_args
act { super }
end
def save_if_needed
validate
save if save_needed?
end
def save_if_needed!
validate
save! if save_needed?
end
def save_needed?
# (
new? || test_field_changing? || subcards.cards.any?(&:save_needed?)
# ).tap do |r|
# # binding.pry if r
# puts "save needed for #{name}".yellow if r && !new?
# end
end
alias_method :update_attributes, :update
alias_method :update_attributes!, :update!
def restore_changes_information
# restores changes for integration phase
# (rails cleared them in an after_create/after_update hook which is
# executed before the integration phase)
return unless saved_changes.present?
@mutations_from_database = mutations_before_last_save
end
def clear_action_specific_attributes
self.class.action_specific_attributes.each do |attr|
instance_variable_set "@#{attr}", nil
end
end
private
def test_field_changing?
save_test_fields.any? { |fld| send "#{fld}_is_changing?" }
end
def save_test_fields
%i[name db_content trash type_id codename]
end
def start_new_act &block
self.director = nil
Director.run_act(self) do
run_callbacks(:act, &block)
end
end
def add_to_act options={}
director.appoint self unless @director
director.head = true unless options[:validating] || options[:as_subcard]
yield
end
end
end
end