Module: ActiveSupport::Configurable::ClassMethods

Defined in:
activesupport/lib/active_support/configurable.rb

Instance Method Summary collapse

Instance Method Details

#configObject


27
28
29
30
31
32
33
34
# File 'activesupport/lib/active_support/configurable.rb', line 27

def config
  @_config ||= if respond_to?(:superclass) && superclass.respond_to?(:config)
    superclass.config.inheritable_copy
  else
    # create a new "anonymous" class that will host the compiled reader methods
    Class.new(Configuration).new
  end
end

#config_accessor(*names) ⇒ Object

Allows you to add shortcut so that you don't have to refer to attribute through config. Also look at the example for config to contrast.

Defines both class and instance config accessors.

class User
  include ActiveSupport::Configurable
  config_accessor :allowed_access
end

User.allowed_access # => nil
User.allowed_access = false
User.allowed_access # => false

user = User.new
user.allowed_access # => false
user.allowed_access = true
user.allowed_access # => true

User.allowed_access # => false

The attribute name must be a valid method name in Ruby.

class User
  include ActiveSupport::Configurable
  config_accessor :"1_Badname"
end
# => NameError: invalid config attribute name

To opt out of the instance writer method, pass instance_writer: false. To opt out of the instance reader method, pass instance_reader: false.

class User
  include ActiveSupport::Configurable
  config_accessor :allowed_access, instance_reader: false, instance_writer: false
end

User.allowed_access = false
User.allowed_access # => false

User.new.allowed_access = true # => NoMethodError
User.new.allowed_access        # => NoMethodError

Or pass instance_accessor: false, to opt out both instance methods.

class User
  include ActiveSupport::Configurable
  config_accessor :allowed_access, instance_accessor: false
end

User.allowed_access = false
User.allowed_access # => false

User.new.allowed_access = true # => NoMethodError
User.new.allowed_access        # => NoMethodError

Also you can pass a block to set up the attribute with a default value.

class User
  include ActiveSupport::Configurable
  config_accessor :hair_colors do
    [:brown, :black, :blonde, :red]
  end
end

User.hair_colors # => [:brown, :black, :blonde, :red]

106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'activesupport/lib/active_support/configurable.rb', line 106

def config_accessor(*names)
  options = names.extract_options!

  names.each do |name|
    raise NameError.new('invalid config attribute name') unless name =~ /^[_A-Za-z]\w*$/

    reader, reader_line = "def #{name}; config.#{name}; end", __LINE__
    writer, writer_line = "def #{name}=(value); config.#{name} = value; end", __LINE__

    singleton_class.class_eval reader, __FILE__, reader_line
    singleton_class.class_eval writer, __FILE__, writer_line

    unless options[:instance_accessor] == false
      class_eval reader, __FILE__, reader_line unless options[:instance_reader] == false
      class_eval writer, __FILE__, writer_line unless options[:instance_writer] == false
    end
    send("#{name}=", yield) if block_given?
  end
end

#configure {|config| ... } ⇒ Object

Yields:


36
37
38
# File 'activesupport/lib/active_support/configurable.rb', line 36

def configure
  yield config
end