class Module
def thread_mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil) # :nodoc:
Current.new.user = "DHH" # => NoMethodError
end
thread_mattr_writer :user, instance_writer: false
class Current
instance_writer: false or instance_accessor: false.
To omit the instance writer method, pass
Thread.current[:attr_Current_user] # => "DHH"
Current.user = "DHH"
end
thread_mattr_writer :user
module Current
allow assignment to the attribute.
Defines a per-thread class attribute and creates a class and instance writer methods to
def thread_mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil) # :nodoc: syms.each do |sym| raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym) # The following generated method concatenates `name` because we want it # to work with inheritance via polymorphism. class_eval(<<-EOS, __FILE__, __LINE__ + 1) def self.#{sym}=(obj) @__thread_mattr_#{sym} ||= "attr_\#{name}_#{sym}" ::ActiveSupport::IsolatedExecutionState[@__thread_mattr_#{sym}] = obj end EOS if instance_writer && instance_accessor class_eval(<<-EOS, __FILE__, __LINE__ + 1) def #{sym}=(obj) self.class.#{sym} = obj end EOS end public_send("#{sym}=", default) unless default.nil? end end