Usando filter_parameters en ApplicationController con Rails 2.3

by Gastón Ramos

Cómo uds. saben ApplicationController trae un método con el cual podemos ocultar datos sensibles que no queremos que aparezcan en los logs (véase la doc ) pero hay veces que además de ocultar los params en los logs, también necesitamos usar este mismo params ya procesado (con los valores FILTERED) en otro lado, por ejemplo para una app que loggea en una tabla todo lo que un user hace (incluido action, controler y params en cuestión) para esto podemos usar filter_parameters(params) que retorna el hash params filtrado, para entender un poco más cómo funciona podés leer los tests de rails en el archivo vendor/rails/actionpack/test/controller/filter_params_test.rb, cómo llegué a este archivo? fácil primero leí el código del método filter_parameter_logging, ahí me ví que crea un método al vuelo llamado filter_parameters y luego de eso simplemente hice un grep:


grep -r filter_parameters vendor/rails/ -n
vendor/rails/actionpack/test/controller/filter_params_test.rb:11:  
def test_filter_parameters
vendor/rails/actionpack/test/controller/filter_params_test.rb:13:    
assert !@controller.respond_to?(:filter_parameters)
vendor/rails/actionpack/test/controller/filter_params_test.rb:16:    
assert @controller.respond_to?(:filter_parameters)
vendor/rails/actionpack/test/controller/filter_params_test.rb:33:      
assert_equal after_filter, @controller.__send__(:filter_parameters, before_filter)
vendor/rails/actionpack/test/controller/filter_params_test.rb:43:      
assert_equal after_filter, @controller.__send__(:filter_parameters, before_filter)
vendor/rails/actionpack/test/controller/filter_params_test.rb:47:  
def test_filter_parameters_is_protected
vendor/rails/actionpack/test/controller/filter_params_test.rb:49:    
assert !FilterParamController.action_methods.include?('filter_parameters')
vendor/rails/actionpack/test/controller/filter_params_test.rb:50:   
 assert_raise(NoMethodError) { @controller.filter_parameters([{'password' => '[FILTERED]'}]) }
vendor/rails/actionpack/lib/action_controller/base.rb:486:        
define_method(:filter_parameters) do |unfiltered_parameters|
vendor/rails/actionpack/lib/action_controller/base.rb:493:            
  filtered_parameters[key] = filter_parameters(value)
vendor/rails/actionpack/lib/action_controller/base.rb:498:                 
 filter_parameters(item)
vendor/rails/actionpack/lib/action_controller/base.rb:515:        
protected :filter_parameters
vendor/rails/actionpack/lib/action_controller/base.rb:1319:      
  parameters = respond_to?(:filter_parameters) ? filter_parameters(params) : params.dup

Bueno cortito, pero útil ;)