禁用特定操作的强参数

dav*_*idb 12 ruby-on-rails strong-parameters ruby-on-rails-4.2

强参数问题严重.它在我的大约200个动作中工作得很好,但在一个它没有,因为我在那里使用参数非常动态,我也因为应用程序设计而无法改变它.

所以我想在这个特定的操作中禁用强参数验证.有没有办法做到这一点?

Rit*_*hie 15

强参数会覆盖该params方法ActionController::Base.您可以简单地覆盖它并将其重新设置为您自己想要的.

所以这:

class MyController < ApplicationController
  def params
    request.parameters
  end
end
Run Code Online (Sandbox Code Playgroud)

将有效地禁用控制器中所有操作的强参数.你只想为特定的动作禁用它,所以你可以这样做:

class MyController < ApplicationController
  before_action :use_unsafe_params, only: [:particular_action]

  def params
    @_dangerous_params || super
  end

  def particular_action
    # My params is unsafe
  end

  def normal_action
    # my params is safe
  end

  private

  def use_unsafe_params
    @_dangerous_params = request.parameters
  end
end
Run Code Online (Sandbox Code Playgroud)


Saj*_*ani 7

不太确定这是否是最佳实践,但对于 Rails 5,我只是使用request.params而不是params任何我想跳过强参数的时候。

所以而不是像这样:

post = Post.new(params[:post])
Run Code Online (Sandbox Code Playgroud)

我用:

post = Post.new(request.params[:post])
Run Code Online (Sandbox Code Playgroud)


max*_*max 4

您可以使用.permit!将哈希中的任何键列入白名单。

params.require(:something).permit!
Run Code Online (Sandbox Code Playgroud)

然而,这应该被视为极端的代码味道和安全风险。

可以使用此技巧将嵌套哈希列入白名单:

params.require(:product).permit(:name, data: params[:product][:data].try(:keys))
Run Code Online (Sandbox Code Playgroud)