我对强参数有严重问题。它在我的大约200个动作中工作得相当好,但在一个动作中它没有,因为我在那里使用参数非常动态,我也因为应用程序设计而无法改变它。
所以我想在这个特定的操作中禁用强参数验证。有没有办法做到这一点?
答案 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])