Я не думаю, что есть встроенный метод для этого, поэтому простой рекурсивный метод в следующих строках является одним из решений:
def recursive_delete(hash, to_remove)
hash.delete(to_remove)
hash.each_value do |value|
recursive_delete(value, to_remove) if value.is_a? Hash
end
end
С данными вашего примера:
h = { :action => "index", :controller => "home", :secret => "I love Jeff Atwood",
:user => {:name => "Steve", :secret => "I steal Joel's pants"}}
recursive_delete(h, :secret)
puts h.inspect
Дает:
{:controller=>"home", :user=>{:name=>"Steve"}, :action=>"index"}
Обратите внимание, что это решение работает на месте, т. Е. Оно модифицирует исходный хеш, а не возвращает новый хеш с исключенным запрошенным ключом.