Class: Dry::View::Part Abstract
- Inherits:
-
Object
- Object
- Dry::View::Part
- Includes:
- DecoratedAttributes
- Defined in:
- lib/dry/view/part.rb
Overview
Subclass this and provide your own methods adding view-specific behavior. You should not override ‘#initialize`.
Decorates an exposure value and provides a place to encapsulate view-specific behavior alongside your application’s domain objects.
Constant Summary collapse
- CONVENIENCE_METHODS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
%i[ format context render scope value ].freeze
Instance Attribute Summary collapse
-
#_name ⇒ Symbol
readonly
The part’s name.
-
#_render_env ⇒ RenderEnvironment
readonly
private
The current render environment.
-
#_value ⇒ Object
readonly
The decorated value.
Class Method Summary collapse
-
.part_name(inflector) ⇒ Object
private
Determins a part name (when initialized without one).
Instance Method Summary collapse
-
#_context ⇒ Context
The context object for the current render environment.
-
#_format ⇒ Symbol
The template format for the current render environment.
-
#_render(partial_name, as: _name, **locals, &block) ⇒ String
Renders a new partial with the part included in its locals.
-
#_scope(scope_name = nil, **locals) ⇒ Dry::View::Scope
Builds a new scope with the part included in its locals.
-
#initialize(value:, render_env: RenderEnvironmentMissing.new, name: self.class.part_name(render_env.inflector)) ⇒ Part
constructor
Returns a new Part instance.
-
#inspect ⇒ String
Returns a string representation of the part.
-
#new(klass = self.class, name: _name, value: _value, **options) ⇒ Object
Builds a new a part with the given parameters.
-
#to_s ⇒ String
Returns a string representation of the value.
Methods included from DecoratedAttributes
Constructor Details
#initialize(value:, render_env: RenderEnvironmentMissing.new, name: self.class.part_name(render_env.inflector)) ⇒ Part
Returns a new Part instance
73 74 75 76 77 78 79 80 |
# File 'lib/dry/view/part.rb', line 73 def initialize( value:, render_env: RenderEnvironmentMissing.new, name: self.class.part_name(render_env.inflector) ) @_name = name @_value = value @_render_env = render_env end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object (private)
Handles missing methods. If the ‘_value` responds to the method, then the method will be sent to the value.
198 199 200 201 202 203 204 205 206 |
# File 'lib/dry/view/part.rb', line 198 def method_missing(name, *args, &block) if _value.respond_to?(name) _value.public_send(name, *args, &block) elsif CONVENIENCE_METHODS.include?(name) __send__(:"_#{name}", *args, &block) else super end end |
Instance Attribute Details
#_name ⇒ Symbol (readonly)
The part’s name. This comes from the exposure supplying the value.
36 37 38 |
# File 'lib/dry/view/part.rb', line 36 def _name @_name end |
#_render_env ⇒ RenderEnvironment (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
The current render environment
56 57 58 |
# File 'lib/dry/view/part.rb', line 56 def _render_env @_render_env end |
#_value ⇒ Object (readonly) #value ⇒ Object (readonly)
The decorated value. This is the value returned from the exposure.
49 50 51 |
# File 'lib/dry/view/part.rb', line 49 def _value @_value end |
Class Method Details
.part_name(inflector) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Determins a part name (when initialized without one). Intended for use only while unit testing Parts.
62 63 64 |
# File 'lib/dry/view/part.rb', line 62 def self.part_name(inflector) name ? inflector.underscore(inflector.demodulize(name)) : "part" end |
Instance Method Details
#_context ⇒ Context #context ⇒ Context
The context object for the current render environment
108 109 110 |
# File 'lib/dry/view/part.rb', line 108 def _context _render_env.context end |
#_format ⇒ Symbol #format ⇒ Symbol
The template format for the current render environment.
93 94 95 |
# File 'lib/dry/view/part.rb', line 93 def _format _render_env.format end |
#_render(partial_name, as: _name, **locals, &block) ⇒ String #render(partial_name, as: _name, **locals, &block) ⇒ String
Renders a new partial with the part included in its locals.
128 129 130 |
# File 'lib/dry/view/part.rb', line 128 def _render(partial_name, as: _name, **locals, &block) _render_env.partial(partial_name, _render_env.scope({as => self}.merge(locals)), &block) end |
#_scope(scope_name = nil, **locals) ⇒ Dry::View::Scope #scope(scope_name = nil, **locals) ⇒ Dry::View::Scope
Builds a new scope with the part included in its locals.
147 148 149 |
# File 'lib/dry/view/part.rb', line 147 def _scope(scope_name = nil, **locals) _render_env.scope(scope_name, {_name => self}.merge(locals)) end |
#inspect ⇒ String
Returns a string representation of the part
190 191 192 |
# File 'lib/dry/view/part.rb', line 190 def inspect %(#<#{self.class.name} name=#{_name.inspect} value=#{_value.inspect}>) end |
#new(klass = self.class, name: _name, value: _value, **options) ⇒ Object
Builds a new a part with the given parameters
This is helpful for manually constructing a new part object that maintains the current render environment.
However, using ‘.decorate` is preferred for declaring attributes that should also be decorated as parts.
176 177 178 179 180 181 182 183 |
# File 'lib/dry/view/part.rb', line 176 def new(klass = self.class, name: _name, value: _value, **) klass.new( name: name, value: value, render_env: _render_env, ** ) end |
#to_s ⇒ String
Returns a string representation of the value
156 157 158 |
# File 'lib/dry/view/part.rb', line 156 def to_s _value.to_s end |