跳至内容 跳至搜索
方法
C

实例公共方法

config()

从配置 OrderedOptions 读取和写入属性。

require "active_support/configurable"

class User
  include ActiveSupport::Configurable
end

User.config.allowed_access = true
User.config.level = 1

User.config.allowed_access # => true
User.config.level          # => 1
# File activesupport/lib/active_support/configurable.rb, line 49
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

configure()

在传入的块中配置值。

require "active_support/configurable"

class User
  include ActiveSupport::Configurable
end

User.allowed_access # => nil

User.configure do |config|
  config.allowed_access = true
end

User.allowed_access # => true
# File activesupport/lib/active_support/configurable.rb, line 73
def configure
  yield config
end

实例私有方法

config_accessor(*names, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil)

允许您添加快捷方式,以便不必通过 config 来引用属性。还可以查看 config 的示例进行对比。

定义类和实例配置访问器。

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

属性名称必须是 Ruby 中有效的名称。

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

要省略实例写入方法,请传递 instance_writer: false。要省略实例读取方法,请传递 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

或者传递 instance_accessor: false,以省略两个实例方法。

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

您还可以传递 default 或一个块来设置属性的默认值。

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

User.allowed_access # => false
User.hair_colors # => [:brown, :black, :blonde, :red]
# File activesupport/lib/active_support/configurable.rb, line 145
def config_accessor(*names, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil) # :doc:
  names.each do |name|
    raise NameError.new("invalid config attribute name") unless /\A[_A-Za-z]\w*\z/.match?(name)

    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

    if instance_accessor
      class_eval reader, __FILE__, reader_line if instance_reader
      class_eval writer, __FILE__, writer_line if instance_writer
    end

    send("#{name}=", block_given? ? yield : default)
  end
end