From cb2381696029ad839ecddad08afea061d07685fb Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 9 Jul 2007 21:49:37 +0000 Subject: Added Hash#except which is the inverse of Hash#slice -- return the hash except the keys that are specified [DHH] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7172 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activesupport/lib/active_support/core_ext/hash.rb | 3 ++- .../lib/active_support/core_ext/hash/except.rb | 24 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 activesupport/lib/active_support/core_ext/hash/except.rb (limited to 'activesupport/lib') diff --git a/activesupport/lib/active_support/core_ext/hash.rb b/activesupport/lib/active_support/core_ext/hash.rb index 2a99468b4e..b805d2da62 100644 --- a/activesupport/lib/active_support/core_ext/hash.rb +++ b/activesupport/lib/active_support/core_ext/hash.rb @@ -1,4 +1,4 @@ -%w(keys indifferent_access reverse_merge conversions diff slice).each do |ext| +%w(keys indifferent_access reverse_merge conversions diff slice except).each do |ext| require "#{File.dirname(__FILE__)}/hash/#{ext}" end @@ -9,4 +9,5 @@ class Hash #:nodoc: include ActiveSupport::CoreExtensions::Hash::Conversions include ActiveSupport::CoreExtensions::Hash::Diff include ActiveSupport::CoreExtensions::Hash::Slice + include ActiveSupport::CoreExtensions::Hash::Except end diff --git a/activesupport/lib/active_support/core_ext/hash/except.rb b/activesupport/lib/active_support/core_ext/hash/except.rb new file mode 100644 index 0000000000..8362cd880e --- /dev/null +++ b/activesupport/lib/active_support/core_ext/hash/except.rb @@ -0,0 +1,24 @@ +require 'set' + +module ActiveSupport #:nodoc: + module CoreExtensions #:nodoc: + module Hash #:nodoc: + # Return a hash that includes everything but the given keys. This is useful for + # limiting a set of parameters to everything but a few known toggles: + # + # @person.update_attributes(params[:person].except(:admin)) + module Except + # Returns a new hash without the given keys. + def except(*keys) + rejected = Set.new(respond_to?(:convert_key) ? keys.map { |key| convert_key(key) } : keys) + reject { |key,| rejected.include?(key) } + end + + # Replaces the hash without only the given keys. + def except!(*keys) + replace(except(*keys)) + end + end + end + end +end -- cgit v1.2.3