class SimpleForm::Wrappers::Many
on demand on input generation.
It may optionally receive a namespace, allowing it to be configured
`Many` represents a wrapper around several components at the same time.
need to modify the code only to wrap input in an extra tag.
This API allows inputs/components to be easily wrapped, removing the
A component may be any object that responds to ‘render`.
A wrapper is an object that holds several components and render them.
def find(name)
def find(name) return self if namespace == name @components.each do |c| if c.is_a?(Symbol) return nil if c == namespace elsif value = c.find(name) return value end end nil end
def html_classes(input, options)
def html_classes(input, options) @defaults[:class].dup end
def html_options(options)
def html_options(options) (@defaults[:html] || {}).merge(options[:"#{namespace}_html"] || {}) end
def initialize(namespace, components, defaults = {})
def initialize(namespace, components, defaults = {}) @namespace = namespace @components = components @defaults = defaults @defaults[:tag] = :div unless @defaults.key?(:tag) @defaults[:class] = Array(@defaults[:class]) end
def render(input)
def render(input) content = "".html_safe options = input.options components.each do |component| next if options[component.namespace] == false rendered = component.render(input) content.safe_concat rendered.to_s if rendered end wrap(input, options, content) end
def wrap(input, options, content)
def wrap(input, options, content) return content if options[namespace] == false return if defaults[:unless_blank] && content.empty? tag = (namespace && options[:"#{namespace}_tag"]) || @defaults[:tag] return content unless tag klass = html_classes(input, options) opts = html_options(options) opts[:class] = (klass << opts[:class]).join(' ').strip unless klass.empty? input.template.content_tag(tag, content, opts) end