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
# File lib/typhoeus_fix/array_decoder.rb, line 46 def decode(hash) decode!(hash.dup) end
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
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
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
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