如何使用查询参数,如强参数?

时间:2019-12-05 11:17:18

标签: ruby-on-rails ruby performance ruby-on-rails-3 parameters

如何使用查询参数作为强参数。 这是前端调用的我的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]',我应该怎么做。

1 个答案:

答案 0 :(得分:2)

ActionController::Parameters实际上只是一个类似于对象的哈希,而“强参数”实际上等效于使用Hash#slice仅允许属性白名单通过。可以防止大规模分配攻击。初学者和经验丰富的Rails开发人员。似乎认为它神奇地过滤并清除了参数。并非如此-只是防止您因无知,愚蠢或懒惰而遭受大规模注射攻击。

仅当您为模型分配参数哈希时才需要白名单:

User.update(
  params.permit(:email, :password)
)

在这种情况下,它防止恶意用户例如通过role=superadminid=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%的时间会这样做,因为如果我们不能对请求做任何有意义的事情,它就会提早解决。