Sha256: ef16d642bf7334e5746e22172dcb420d1458873c9f8b7c82027b037f51f3ff8f

Contents?: true

Size: 1.36 KB

Versions: 1

Compression:

Stored size: 1.36 KB

Contents

module CarrierWave
  module ModelDelegateAttribute
    extend ::ActiveSupport::Concern
    
    module ClassMethods
      def model_delegate_attribute(attribute, default = nil)
        attr_accessor attribute

        before :remove, :"reset_#{attribute}"

        var_name = :"@#{attribute}"

        define_method :"#{attribute}" do
          model_accessor = model_getter_name(attribute)
          value = instance_variable_get(var_name)
          value ||= self.model.send(model_accessor) if self.model.present? && self.model.respond_to?(model_accessor)
          value ||= default
          instance_variable_set(var_name, value)
        end

        define_method :"#{attribute}=" do |value|
          model_accessor = model_getter_name(attribute)
          instance_variable_set(var_name, value)
          if self.model.present? && self.model.respond_to?(:"#{model_accessor}=") && !self.model.destroyed?
            self.model.send(:"#{model_accessor}=", value) 
          end
        end

        define_method :"reset_#{attribute}" do
          self.send(:"#{attribute}=", default)
          send(:"#{attribute}=", default)
        end
      end
    end
    
    private
    def model_getter_name(attribute)
      name = []
      name << mounted_as if mounted_as.present?
      name << version_name if version_name.present?
      name << attribute
      name.join('_')
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
carrierwave-meta-0.0.4 lib/carrierwave-meta/model_delegate_attribute.rb