diff --git a/lib/acts_as_virtual_field.rb b/lib/acts_as_virtual_field.rb index 54735d4..a917e6e 100644 --- a/lib/acts_as_virtual_field.rb +++ b/lib/acts_as_virtual_field.rb @@ -1,5 +1,5 @@ require "acts_as_virtual_field/version" - -module ActsAsVirtualField - require 'acts_as_virtual_field/virtual_field' -end +require 'acts_as_virtual_field/virtual_field' +require "acts_as_virtual_field/formtastic/virtual_field_type_input" +require "acts_as_virtual_field/formtastic/virtual_input" +require "acts_as_virtual_field/active_record/acts/virtual_field" \ No newline at end of file diff --git a/lib/acts_as_virtual_field/active_record/acts/virtual_field.rb b/lib/acts_as_virtual_field/active_record/acts/virtual_field.rb index 0b858a1..e70b30c 100644 --- a/lib/acts_as_virtual_field/active_record/acts/virtual_field.rb +++ b/lib/acts_as_virtual_field/active_record/acts/virtual_field.rb @@ -1,16 +1,17 @@ module ActiveRecord module Acts #:nodoc: module VirtualField #:nodoc: - def acts_as_virtual_field(*args) + + def acts_as_virtual_field_for(column = :value, *args) options = args.extract_options! - cattr_accessor :virtual_field_column, :virtual_field_association - self.virtual_field_association = options[:class] || 'VirtualField' - self.virtual_field_column = options[:column] || :value + cattr_accessor :virtual_field_column, :virtual_field_association, :virtual_field_foreign_key + self.virtual_field_association = options[:class_name] || 'VirtualField' + self.virtual_field_column = column + self.virtual_field_foreign_key = options[:foreign_key] || 'virtual_field_id' belongs_to :virtual_field, :class_name => self.virtual_field_association.to_s, - :foreign_key => 'virtual_field_id' - :dependent => :delete_all + :foreign_key => self.virtual_field_foreign_key.to_s include InstanceMethods end @@ -26,9 +27,12 @@ def formtastic_options } opts[:collection] = self.virtual_field.field_meta.split(/\r?\n/) if klass.collection? opts[:input_html] = klass.html_options if klass.has_html_options? + opts end end end end -end \ No newline at end of file +end + +ActiveRecord::Base.extend ::ActiveRecord::Acts::VirtualField \ No newline at end of file diff --git a/lib/acts_as_virtual_field/fields/base.rb b/lib/acts_as_virtual_field/fields/base.rb index 6f77c15..1e32b37 100644 --- a/lib/acts_as_virtual_field/fields/base.rb +++ b/lib/acts_as_virtual_field/fields/base.rb @@ -4,11 +4,11 @@ class Base class << self def view_as - self::VIEW_AS || :string + self::VIEW_AS rescue :string end def has_html_options? - self::HTML_OPTIONS || false + self::HTML_OPTIONS rescue false end def html_options @@ -16,7 +16,7 @@ def html_options end def label - self::LABEL || '' + self::LABEL rescue '' end def collection? diff --git a/lib/acts_as_virtual_field/formtastic/virtual_field_type_input.rb b/lib/acts_as_virtual_field/formtastic/virtual_field_type_input.rb new file mode 100644 index 0000000..b89fbd6 --- /dev/null +++ b/lib/acts_as_virtual_field/formtastic/virtual_field_type_input.rb @@ -0,0 +1,9 @@ +module Formtastic + module Inputs + class VirtualFieldTypeInput < Formtastic::Inputs::SelectInput + def collection_from_options + ::ActsAsVirtualField::VirtualField.types + end + end + end +end \ No newline at end of file diff --git a/lib/acts_as_virtual_field/formtastic/virtual_input.rb b/lib/acts_as_virtual_field/formtastic/virtual_input.rb new file mode 100644 index 0000000..3b630df --- /dev/null +++ b/lib/acts_as_virtual_field/formtastic/virtual_input.rb @@ -0,0 +1,10 @@ +module Formtastic + module Helpers + module InputHelper + def virtual_input(method, options = {}) + base_options = @object.formtastic_options + input(method, options.merge(base_options)) + end + end + end +end \ No newline at end of file diff --git a/lib/acts_as_virtual_field/validations.rb b/lib/acts_as_virtual_field/validations.rb new file mode 100644 index 0000000..f9350e2 --- /dev/null +++ b/lib/acts_as_virtual_field/validations.rb @@ -0,0 +1,7 @@ +module Fields + module Validations + autoload :Required, 'fields/validations/required' + autoload :Formated, 'fields/validations/formated' + autoload :Conditioned, 'fields/validations/conditioned' + end +end \ No newline at end of file diff --git a/lib/acts_as_virtual_field/validations/formated.rb b/lib/acts_as_virtual_field/validations/formated.rb new file mode 100644 index 0000000..60845b1 --- /dev/null +++ b/lib/acts_as_virtual_field/validations/formated.rb @@ -0,0 +1,30 @@ +module Fields + module Validations + module Formated + + def validates_field_value_format_of(*attr_names) + validates_with FieldsFormatValidator, _merge_attributes(attr_names) + end + + class FieldsFormatValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + normal_value = Yajl::Parser.parse(value || '') + unless normal_value.empty? + klass = "::Fields::#{record.field_type}".constantize + begin + args = case record.field_type + when "SingleList", "MultipleList" + [record.field_meta, value] + else + [normal_value] + end + klass.new(*args) + rescue + record.errors[:base] << (options[:message] || "has broken format (must be #{record.field_type})") + end + end + end + end + end + end +end \ No newline at end of file diff --git a/lib/acts_as_virtual_field/validations/required.rb b/lib/acts_as_virtual_field/validations/required.rb new file mode 100644 index 0000000..9955636 --- /dev/null +++ b/lib/acts_as_virtual_field/validations/required.rb @@ -0,0 +1,19 @@ +module Fields + module Validations + module Required + + def validates_field_value_presence_of(*attr_names) + validates_with FieldsRequiredValidator, _merge_attributes(attr_names) + end + + class FieldsRequiredValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + normal_value = Yajl::Parser.parse(value || '') + if record.required? && normal_value.empty? + record.errors[:base] << (options[:message] || "is required") + end + end + end + end + end +end \ No newline at end of file diff --git a/lib/acts_as_virtual_field/virtual_field.rb b/lib/acts_as_virtual_field/virtual_field.rb index abb7246..0a17e8f 100644 --- a/lib/acts_as_virtual_field/virtual_field.rb +++ b/lib/acts_as_virtual_field/virtual_field.rb @@ -22,7 +22,7 @@ def excludes def types (self.constants - self.excludes).map do |submodule| - [submodule.to_s, self.const_get(submodule)::LABEL.to_s] + [self.const_get(submodule)::LABEL.to_s, submodule.to_s] end end