禁用特定操作的强参数

时间:2015-05-28 14:36:49

标签: ruby-on-rails strong-parameters ruby-on-rails-4.2

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

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

3 个答案:

答案 0 :(得分:15)

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

所以这个:

class MyController < ApplicationController
  def params
    request.parameters
  end
end

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

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

答案 1 :(得分:2)

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

params.require(:something).permit!

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

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

params.require(:product).permit(:name, data: params[:product][:data].try(:keys))

答案 2 :(得分:0)

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

所以不是这样的:

post = Post.new(params[:post])

我使用:

post = Post.new(request.params[:post])