module TyphoeusFix

Typhoeus encodes arrays as hashes {'0' => v0, '1' => v1, .., 'n' => vN }

To fix this in your rails server your should: in Gemfile:

gem 'logical_model', '~> 0.3.2'

in application_controller.rb:

require 'typhoeus_fix/array_decoder'
class ApplicationController < ActionController::Base
  include TyphoeusFix
  before_filter :decode_typhoeus_arrays
end

Public Instance Methods

decode(hash) click to toggle source
# File lib/typhoeus_fix/array_decoder.rb, line 46
def decode(hash)
  decode!(hash.dup)
end
decode!(hash) click to toggle source

Recursively decodes Typhoeus encoded arrays in given Hash.

@param hash [Hash]. This Hash will be modified!

@return [Hash] Hash with properly decoded nested arrays.

# File lib/typhoeus_fix/array_decoder.rb, line 35
def decode!(hash)
  return hash unless hash.is_a?(Hash)
  hash.each_pair do |key,value|
    if value.is_a?(Hash)
      decode!(value)
      hash[key] = convert(value)
    end
  end
  hash
end
decode_typhoeus_arrays() click to toggle source

Recursively decodes Typhoeus encoded arrays in given Hash.

@example Use directly in a Rails controller.

class ApplicationController
   before_filter :decode_typhoeus_arrays
end

@author Dwayne Macgowan

# File lib/typhoeus_fix/array_decoder.rb, line 26
def decode_typhoeus_arrays
  decode!(params)
end

Private Instance Methods

convert(hash) click to toggle source

If the Hash is an array encoded by typhoeus an array is returned else the self is returned

@param hash [Hash] The Hash to convert into an Array.

@return [Arraya/Hash]

# File lib/typhoeus_fix/array_decoder.rb, line 75
def convert(hash)
  if encoded?(hash)
    Hash[hash.sort_by{|k,v|k.to_i}].values
  else
    hash
  end
end
encoded?(hash) click to toggle source

Checks if Hash is an Array encoded as a Hash. Specifically will check for the Hash to have this form: {'0' => v0, '1' => v1, .., 'n' => vN }

@param hash [Hash]

@return [Boolean] True if its a encoded Array, else false.

# File lib/typhoeus_fix/array_decoder.rb, line 59
def encoded?(hash)
  return false if hash.empty?
  if hash.keys.size > 1
    keys = hash.keys.map{|i| i.to_i if i.respond_to?(:to_i)}.sort
    keys == hash.keys.size.times.to_a
  else
    hash.keys.first =~ /0/
  end
end