Sha256: f2cd0137086ad45fc2140b96f69ad0f796813e6ef342b791e5a228ecf25f2089

Contents?: true

Size: 1.63 KB

Versions: 1

Compression:

Stored size: 1.63 KB

Contents

module SafeAttributes
  extend ActiveSupport::Concern

  module ClassMethods
    # 
    # Within your model call this method once with a list of 
    # methods matching either attribute() or attribute=() for 
    # attributes (column names) you do not want to create the
    # the normal method for.  You should not need to do this
    # but the option is there in case the default list is 
    # inadequate.
    #
    def bad_attribute_names(*attrs)
      @bad_attribute_names ||= lambda {
        methods = Array.new(attrs.collect { |x| x.to_sym })
        methods += ActiveRecord::Base.public_instance_methods.collect { |x| x.to_sym }
        methods += ActiveRecord::Base.protected_instance_methods.collect { |x| x.to_sym }
        methods += ActiveRecord::Base.private_instance_methods.collect { |x| x.to_sym }
        methods -= [:id]
        return methods
      }.call
    end

    # 
    # Override the default implementation to not create the
    # attribute() method if that method name is in the list of
    # bad names
    #
    def define_method_attribute(attr_name)
      return if (bad_attribute_names.include?(attr_name.to_sym))
      super(attr_name)
    end

    #
    # Override the default implementation to not create the
    # attribute= method if that method name is in the list of
    # bad names
    #
    def define_method_attribute=(attr_name)
      method = attr_name + '='
      return if (bad_attribute_names.include?(method.to_sym))
      super(attr_name)
    end
  end

  module InstanceMethods
    def read_attribute_for_validation(attr)
      self[attr.to_sym]
    end
  end

end

require 'safe_attributes/railtie.rb' if defined?(Rails)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
safe_attributes-1.0.4 lib/safe_attributes.rb