Sha256: e55151f53222fd0b85266bc3e645ff05d183c55008f3cee823c0645da03fb95b

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

module LaserLemon
  module SearchParty
    module Request
      def self.included(base)
        base.cattr_accessor :search_parameter_models
        base.search_parameter_models = {}
        
        base.cattr_accessor :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
    
    module Controller
      def self.included(base)
        base.attr_internal :search_params
        
        base.class_eval do
          alias_method_chain :assign_shortcuts, :search_party
        end
      end
      
      def assign_shortcuts_with_search_party(request, response)
        @_search_params = request.search_parameters
        assign_shortcuts_without_search_party(request, response)
      end
    end
  end
end

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

Version data entries

1 entries across 1 versions & 1 rubygems

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