module ActiveSupport::Configurable::ClassMethods
Открытые методы экземпляра
# 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 Читает и записывает атрибуты из конфигурации 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 73 def configure yield config end
Настраивает значения внутри переданного блока.
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 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 Позволяет добавить краткий способ обращения к атрибуту, чтобы не приходилось обращаться к нему через 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]
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.