module Engine2::ActionSaveSupport

Public Class Methods

included(action) click to toggle source
# File lib/engine2/action.rb, line 879
def self.included action
    action.http_method :post
    class << action
        attr_accessor :validate_only
    end
end

Public Instance Methods

after_save(handler, record) click to toggle source
# File lib/engine2/action.rb, line 944
def after_save handler, record
end
validate_and_approve(handler, record, parent_id, validate_only = self.class.validate_only) click to toggle source
# File lib/engine2/action.rb, line 886
def validate_and_approve handler, record, parent_id, validate_only = self.class.validate_only
    if validate_only
        super(handler, record, parent_id)
    else
        record.skip_save_refresh = true
        record.raise_on_save_failure = false
        model = assets[:model]
        assoc = assets[:assoc]
        new_assoc = record.new? && assoc && assoc[:type]

        save = lambda do |c|
            if super(handler, record, parent_id)
                if new_assoc == :one_to_many
                    handler.permit parent_id
                    assoc[:keys].zip(split_keys(parent_id)).each{|k, v|record[k] = v}
                end

                result = record.save(transaction: false, validate: false)
                if result && new_assoc == :many_to_many
                    handler.permit parent_id
                    model.db[assoc[:join_table]].insert(assoc[:left_keys] + assoc[:right_keys], split_keys(parent_id) + record.primary_key_values)
                end

                model.association_reflections.each do |name, assoc|
                    hash = record[name]
                    if hash.is_a?(Hash)
                        validate_and_approve_association(handler, record, name, :create, hash)
                        validate_and_approve_association(handler, record, name, :modify, hash)
                        nd = node.parent[:"#{name}!"]
                        raise Sequel::Rollback unless record.errors.empty?
                        nd.confirm_delete.delete.*.invoke_delete_db(handler, hash[:delete].to_a, model.table_name) unless hash[:delete].to_a.empty?
                        nd.link.*.invoke_link_db(handler, record.primary_key_values, hash[:link].to_a) unless hash[:link].to_a.empty?
                        nd.confirm_unlink.unlink.*.invoke_unlink_db(handler, record.primary_key_values, hash[:unlink].to_a) unless hash[:unlink].to_a.empty?
                    end
                end
                after_save(handler, record)
                result
            end
        end
        (model.validation_in_transaction || new_assoc == :many_to_many) ? model.db.transaction(&save) : save.(nil)
    end
end
validate_and_approve_association(handler, record, assoc_name, node_name, hash) click to toggle source
# File lib/engine2/action.rb, line 929
def validate_and_approve_association handler, record, assoc_name, node_name, hash
    records = hash[node_name].to_a
    unless records.empty?
        action = node.parent[:"#{assoc_name}!"][node_name].approve.*
        parent_id = join_keys(record.primary_key_values)
        records.each do |arec|
            rec = action.allocate_record(handler, arec)
            action.validate_and_approve(handler, rec, parent_id, false)
            rec.errors.each do |k, v|
                (record.errors[assoc_name] ||= []).concat(v)
            end unless rec.errors.empty?
        end
    end
end