Sha256: 0f27c8470a60b958004939a1dec3107812fff771284cef45cd4259ab9f50724a

Contents?: true

Size: 1.44 KB

Versions: 2

Compression:

Stored size: 1.44 KB

Contents

module Memento
  class Action::Update < Memento::Action::Base

    def fetch
      record.changes_for_memento
    end

    def fetch?
      record.changes_for_memento.any?
    end

    def undo
      if !record
        was_destroyed
      elsif mergable?
        update_record
      else
        was_changed
      end
    end

    private

    def update_record
      record.tap do |object|
        record_data.each do |attribute, values|
          object.send(:"#{attribute}=", values.first)
        end
        object.save!
      end
    end

    def mergable?
      record_data.all? do |attribute, values|
        # ugly fix to compare times
        values = values.map{|v| v.is_a?(Time) ? v.to_s(:db) : v }
        current_value = record.respond_to?(:"#{attribute}_without_formatting") ?
          record.send(:"#{attribute}_without_formatting") :
          record.send(:"#{attribute}")
        current_value = current_value.utc.to_s(:db) if current_value.is_a?(Time)
        values.include?(current_value) || (current_value.is_a?(String) && values.include?(current_value.gsub(/\r\n/, "\n")))
      end || record_data.size.zero?
    end

    def was_destroyed
      new_object do |object|
        object.errors[:memento_undo] << ActiveSupport::StringInquirer.new("was_destroyed")
        object.id = state.record_id
      end
    end

    def was_changed
      record.errors[:memento_undo] << ActiveSupport::StringInquirer.new("was_changed")
      record
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
memento-0.5.2 lib/memento/action/update.rb
memento-0.5.1 lib/memento/action/update.rb