Class: ActionView::UnboundTemplate
| Relationships & Source Files | |
| Inherits: | Object |
| Defined in: | actionview/lib/action_view/unbound_template.rb |
Class Method Summary
Instance Attribute Summary
Instance Method Summary
- #bind_locals(locals)
- #build_bound_template(locals) private
- #build_template(locals) private
- #normalize_locals(locals) private
- #ractor_local_store private
- #ractor_local_templates private
- #built_templates Internal use only
- #freeze Internal use only
Constructor Details
.new(source, identifier, details:, virtual_path:) ⇒ UnboundTemplate
# File 'actionview/lib/action_view/unbound_template.rb', line 10
def initialize(source, identifier, details:, virtual_path:) @source = source @identifier = identifier @details = details @virtual_path = virtual_path @strict_locals_template = nil @templates = Concurrent::Map.new(initial_capacity: 2) @write_lock = Mutex.new end
Instance Attribute Details
#details (readonly)
[ GitHub ]# File 'actionview/lib/action_view/unbound_template.rb', line 7
attr_reader :virtual_path, :details
#format (readonly)
[ GitHub ]#handler (readonly)
[ GitHub ]#locale (readonly)
[ GitHub ]#variant (readonly)
[ GitHub ]#virtual_path (readonly)
[ GitHub ]# File 'actionview/lib/action_view/unbound_template.rb', line 7
attr_reader :virtual_path, :details
Instance Method Details
#bind_locals(locals)
[ GitHub ]# File 'actionview/lib/action_view/unbound_template.rb', line 21
def bind_locals(locals) if @strict_locals_template @strict_locals_template elsif frozen? templates = ractor_local_templates unless template = templates[locals] normalized_locals = normalize_locals(locals) template = templates.compute_if_absent(normalized_locals) { build_template(normalized_locals) } templates[locals.dup] = template end template else @templates[locals] || build_bound_template(locals) end end
#build_bound_template(locals) (private)
[ GitHub ]# File 'actionview/lib/action_view/unbound_template.rb', line 69
def build_bound_template(locals) @write_lock.synchronize do return @strict_locals_template if @strict_locals_template normalized_locals = normalize_locals(locals) # We need ||=, both to dedup on the normalized locals and to check # while holding the lock. template = (@templates[normalized_locals] ||= build_template(normalized_locals)) if template.strict_locals? @strict_locals_template = template @templates = { normalized_locals => template }.freeze else # This may have already been assigned, but we've already de-dup'd so # reassignment is fine. @templates[locals.dup] = template end template end end
#build_template(locals) (private)
[ GitHub ]#built_templates
This method is for internal use only.
[ GitHub ]
# File 'actionview/lib/action_view/unbound_template.rb', line 37
def built_templates # :nodoc: if @strict_locals_template [@strict_locals_template] elsif @templates @templates.values else templates = ractor_local_store[self] templates ? templates.values : [] end end
#freeze
This method is for internal use only.
[ GitHub ]
# File 'actionview/lib/action_view/unbound_template.rb', line 48
def freeze # :nodoc: bind_locals([]) @source.freeze @identifier.freeze @virtual_path.freeze @details.freeze @strict_locals_template.freeze @templates = nil @write_lock = nil super end
#normalize_locals(locals) (private)
[ GitHub ]# File 'actionview/lib/action_view/unbound_template.rb', line 105
def normalize_locals(locals) locals.map(&:to_sym).sort!.freeze end
#ractor_local_store (private)
[ GitHub ]# File 'actionview/lib/action_view/unbound_template.rb', line 65
def ractor_local_store ActiveSupport::Ractors.store_if_absent(:action_view_bound_templates) { Concurrent::Map.new } end
#ractor_local_templates (private)
[ GitHub ]# File 'actionview/lib/action_view/unbound_template.rb', line 61
def ractor_local_templates ractor_local_store.compute_if_absent(self) { Concurrent::Map.new } end