Sha256: 89f73cb6b0d01889bcbc33917d19cd3600ffc89b766855e34e97697b827bc8f6

Contents?: true

Size: 1.49 KB

Versions: 4

Compression:

Stored size: 1.49 KB

Contents

# Provides a virtual attribute that can be get and set like an array, but is realized into other data structure upon saving.
# origin: RM
module ListFieldTrait

  # This is an array that stringifies with comma separators, so we can
  # have a text field in the form for it.
  class CommaSeparatedArray

    include Enumerable

    def initialize(list)
      @list = list
    end

    def each(&block)
      @list.each(&block)
    end

    def <<(element)
      @list << element
    end

    def to_s
      @list.join(', ')
    end

    def to_a
      @list
    end

    def self.wrap(list)
      list.is_a?(self) ? list : new(list)
    end
    
  end

  as_trait do |*args|

    list = args[0]
    options = args[1] || {}
    
    cast_to_integer = options[:integer]
    list_variable = "@#{list}"
    set_list = "#{list}="
    read_list = "read_#{list}"
    write_list = "write_#{list}"
    write_list_if_changed = "write_#{list}_if_changed"

    after_save write_list_if_changed

    define_method list do
      CommaSeparatedArray.wrap(instance_variable_get(list_variable) || send(read_list))
    end

    define_method write_list_if_changed do
      list = instance_variable_get(list_variable)
      send(write_list, list) if list
      true
    end

    define_method set_list do |new_list|
      new_list = new_list.split(/\s*,\s*/) if new_list.is_a?(String)
      new_list.reject!(&:blank?)
      new_list.collect!(&:to_i) if cast_to_integer
      instance_variable_set(list_variable, new_list)
    end

  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
serum-rails-0.2.1 spec/test_apps/rails-2-3/app/models/shared/list_field_trait.rb
serum-rails-0.2.0 spec/test_apps/rails-2-3/app/models/shared/list_field_trait.rb
serum-rails-0.1.1 spec/test_app/app/models/shared/list_field_trait.rb
serum-rails-0.1.0 spec/test_app/app/models/shared/list_field_trait.rb