Rails 3.2.x: 如何使用 ActionController 操作过滤长参数以防止记录?

Rails 3.2.x: how to filter long parameters from getting logged using ActionController action?

类似的问题还有this, this, and this.

None 有帮助,因为目标是防止在特定操作中记录长参数而不是使用 config.filter_parameters。此外,答案必须适用于 Rails 3.2.x 而许多答案基于 Rails 5.

一个答案建议在控制器方法中调用 request.filtered_parameters,但调用 request.filtered_parameters.delete :long_param 并没有阻止 :long_param 被记录。

config.filter_parameters 采用 lambda 函数,因此您可以根据需要进行过滤。查看答案 here and here

如果您只想过滤针对特定操作的冗长争论,那么,您会让您的生活不必要地变得复杂。要么过滤所有长参数,使用 lambda 设置参数值长度限制,要么更改要过滤的操作的参数键,使其唯一,然后按该键过滤。

这可以在 中间件过滤器

的帮助下实现

创建新文件app/middleware/filter_long_params.rb

class FilterLongParams

  def initialize(app, long_params = [])
    @app = app
    @long_params = long_params
  end

  def call(env)
    env["action_dispatch.parameter_filter"] += @long_params unless @long_params.empty?
    status, headers, response = @app.call(env)
    [status, headers, response]
  end
end

然后添加到您的控制器

class YourController
  use FilterLongParams, [:long_param_to_be_filtered], only: :update

end

use的第一个参数是中间件的名称class,第二个参数应该是你要过滤的参数数组,第三个可能是控制器动作的通常范围。

如果 Rails 3.2 不自动加载 app/middleware 路径,请改用 app/controllers