Sha256: dff9ec8fc9eb4ee9db02761a88bb5fec0ed35477c2ebd3727905ca78816c8229

Contents?: true

Size: 1.32 KB

Versions: 1

Compression:

Stored size: 1.32 KB

Contents

module LaserLemon
  module SearchParty
    def self.included(base)
      base.class_inheritable_hash :search_parameter_models
      base.search_parameter_models = {}
      
      base.class_inheritable_array :search_parameter_patterns
      base.search_parameter_patterns = []
    end
    
    def search_parameters
      @search_parameters ||= begin
        query_parameters.symbolize_keys.inject({}) do |new_parameters, (key, value)|
          parsed_value = parse_search_parameter(value)
          if search_parameter_model = self.class.search_parameter_models[key]
            new_values = [*parsed_value].map{|v| search_parameter_model.respond_to?(:from_param) ? search_parameter_model.from_param(v) : search_parameter_model.find_by_id(v) }
            new_value = (parsed_value.is_a?(Array) ? new_values.dup : new_values.first)
          else
            new_value = parsed_value
          end
          new_value.nil? ? new_parameters : new_parameters.update(key => new_value)
        end
      end
    end
    
    private
    
    def parse_search_parameter(value)
      if p = self.class.search_parameter_patterns.detect{|r,v| match = r.match(value) }
        v = p.last
        v.respond_to?(:call) ? v.call(value, $~) : v
      else
        value
      end
    end
  end
end

ActionController::Request.send(:include, LaserLemon::SearchParty)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
laserlemon-search_party-0.1.0 lib/search_party.rb