app/models/cms/form_field.rb
module Cms
class FormField < ActiveRecord::Base
extend DefaultAccessible
belongs_to :form
acts_as_list scope: :form
attr_accessor :edit_path, :delete_path
# Name is assigned when the Field is created, and should not be changed afterwords.
# Otherwise existing entries will not display their data correctly.
#
# FormField#name is used for input fields. I.e. <%= f.input field.name %>
before_validation(on: :create) do
self.name = label.parameterize.underscore.to_sym if label
end
validates :name, :uniqueness => {:scope => :form_id, message: "can only be used once per form."}
def as_json(options={})
super(:methods => [:edit_path, :delete_path])
end
# Return the form widget that should be used to render this field.
#
# @return [Symbol] A SimpleForm input mapping (i.e. :string, :text)
def as
case field_type
when "text_field"
:string
when "text_area"
:text
else
field_type.to_sym
end
end
# Return options to be passed to a SimpleForm input.
# @return [Hash]
# @param [Hash] config
# @option config [Boolean] :disabled If the field should be disabled.
# @option config [FormEntry] :entry
def options(config={})
opts = {label: label}
if field_type != "text_field"
opts[:as] = self.as
end
if config[:disabled]
opts[:disabled] = true
opts[:readonly] = 'readonly'
end
opts[:required] = !!required
opts[:hint] = instructions if instructions
unless choices.blank?
opts[:collection] = parse_choices
opts[:prompt] = !self.required?
end
unless config[:entry] && config[:entry].send(name)
opts[:input_html] = {value: default_value}
end
opts
end
# Don't allow name to be set via UI.
def self.permitted_params
super - [:name]
end
private
# Choices is a single text area where choices are divided by endlines.
def parse_choices
choices.split( /\r?\n/ )
end
end
end