class Mongoid::Scribe::Builders::Field
Public Class Methods
new(form, klass, document, name, config)
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 8 def initialize(form, klass, document, name, config) @form = form @klass = klass @document = document @name = name.to_s @config = config @label_method = @config.fetch(:label, :id) @value_method = @config.fetch(:value, :id) @type = @config.fetch(:type, nil) @polymorphic = false end
Public Instance Methods
field()
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 20 def field return nil if private_field? if @klass.fields[@name].type == Boolean form_field = @form.check_box(@name) elsif @klass.fields[@name].type == Integer form_field = @form.number_field(@name) elsif @type == :textarea form_field = @form.text_area(@name) elsif (@name =~ /email/) || (@type == :email) form_field = @form.email_field(@name) elsif @klass.fields[@name].type == Array && values form_field = checkbox_array elsif values && values.all?{ |value| value.is_a?(Mongoid::Document) || value.is_a?(Mongoid::Criteria) } if @polymorphic options = values.map do |value| [ value.send(@label_method), value.send(@value_method), {data: {type: value.class.name}} ] end form_field = @form.select(@name, options, {}, {class: "polymorphic"}) form_field += @form.hidden_field(@name.gsub("_id", "_type")) else form_field = @form.collection_select(@name, values, @value_method, @label_method) end elsif values form_field = @form.select(@name, values) else form_field = @form.text_field(@name) end return content_tag(:div, (label + form_field).html_safe, class: 'control-group') end
Private Instance Methods
checkbox_array()
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 90 def checkbox_array values.each_with_index.map do |record, index| dom_id = "#{field_name(record.class.name)}_#{index}" checked = @document.send(@name).include?(record.send(@value_method)) label_tag(record.send(@label_method), nil, for: dom_id, class: "stacked") do check_box_tag("#{field_name(@klass)}[#{@name}][]", record.send(@value_method), checked, id: dom_id) + content_tag(:span, record.send(@label_method)) end end.join("\n").html_safe end
field_name(model)
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 86 def field_name(model) model.to_s.underscore.downcase end
label()
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 76 def label @form.label(@name, class: "stacked") end
polymorphic_values(association_name)
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 101 def polymorphic_values(association_name) classes = Mongoid.models.select do |model| model.relations.select{|k, v| v[:as] == association_name }.any? end records = classes.inject([]) do |memo, klass| memo += klass.all memo end return records end
private_field?()
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 80 def private_field? return true if @name.start_with?("_") return true if ["created_at", "updated_at"].include?(@name) return false end
values()
click to toggle source
# File lib/mongoid/scribe/builders/field.rb, line 58 def values return @values if @values @polymorphic = false @values = @config.fetch(:values, nil) if @values.respond_to?(:call) && @values.arity == 1 @values = @values.call(@document) elsif @values.respond_to?(:call) @values = @values.call elsif relation = @document.relations.values.detect{ |data| data.key == @name } if relation.polymorphic? @polymorphic = true @values = polymorphic_values(relation.name) else @values = relation.class_name.constantize.all end end end