如何使用查询参数作为强参数。 这是前端调用的我的POST / tag方法,用于搜索帖子。
def tag
if params[:category] == 'Shop'
render json: ShopPostPopulator.new(params[:search]).run
else
render json: Part.search(params[:search])
end
end
如果我想使用强参数而不是'params [:search]',我应该怎么做。
答案 0 :(得分:2)
ActionController::Parameters
实际上只是一个类似于对象的哈希,而“强参数”实际上等效于使用Hash#slice
仅允许属性白名单通过。可以防止大规模分配攻击。初学者和经验丰富的Rails开发人员。似乎认为它神奇地过滤并清除了参数。并非如此-只是防止您因无知,愚蠢或懒惰而遭受大规模注射攻击。
仅当您为模型分配参数哈希时才需要白名单:
User.update(
params.permit(:email, :password)
)
在这种情况下,它防止恶意用户例如通过role=superadmin
或id=1
(因为第一个用户通常是管理员)。如果您只是从params哈希中分配单个属性,则不需要使用强属性。早在2012年引入的主要区别在于,如果将不带@permitted = true
属性的ActionController :: Parameters对象传递给.new
,.update
,{{1 }}和其他产生或更新记录的方法。
如果愿意,可以使用.create
来确保参数是简单的标量类型(而不是哈希或数组):
ActionController::Parameters#permit
如果params.permit(:search).fetch(:search, nil)
是带有嵌套键的可选参数,则可以将其列入白名单,如下所示:
search
您还可以将参数设置为必需,以便在缺少ActionController :: ParameterMissing异常时引发该异常:
params.fetch(:search, {}).permit(:foo, :bar)
在Rails中,您有99%的时间会这样做,因为如果我们不能对请求做任何有意义的事情,它就会提早解决。