Skip to content

Commit

Permalink
Formtastic helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
simonoff committed Nov 29, 2011
1 parent c954e52 commit 21bde7f
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 15 deletions.
8 changes: 4 additions & 4 deletions 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"
18 changes: 11 additions & 7 deletions 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
Expand All @@ -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
end

ActiveRecord::Base.extend ::ActiveRecord::Acts::VirtualField
6 changes: 3 additions & 3 deletions lib/acts_as_virtual_field/fields/base.rb
Expand Up @@ -4,19 +4,19 @@ 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
self::HTML_OPTIONS
end

def label
self::LABEL || ''
self::LABEL rescue ''
end

def collection?
Expand Down
@@ -0,0 +1,9 @@
module Formtastic
module Inputs
class VirtualFieldTypeInput < Formtastic::Inputs::SelectInput
def collection_from_options
::ActsAsVirtualField::VirtualField.types
end
end
end
end
10 changes: 10 additions & 0 deletions 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
7 changes: 7 additions & 0 deletions 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
30 changes: 30 additions & 0 deletions 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
19 changes: 19 additions & 0 deletions 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
2 changes: 1 addition & 1 deletion lib/acts_as_virtual_field/virtual_field.rb
Expand Up @@ -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

Expand Down

0 comments on commit 21bde7f

Please sign in to comment.