首页 > 解决方案 > 如何使用强参数等查询参数?

问题描述

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

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

解决方案


ActionController::Parameters实际上只是一个像对象一样的哈希,“强参数”实际上相当于使用Hash#slice只允许属性的白名单通过。这可以防止大规模分配攻击。初学者和经常有经验的 Rails 开发人员。似乎认为它神奇地过滤和清理参数。它没有——它只是防止你因为无知、愚蠢或懒惰而受到大规模注射攻击。

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

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

在这种情况下,它可以防止恶意用户通过role=superadminid=1(因为第一个用户通常是管理员)。如果您只是从 params 哈希中分配单个属性,则不需要使用强属性。@permitted = true2012 年引入的主要区别是白名单成为强制性的,因为如果您将没有属性的 ActionController::Parameters 对象传递给 , 和其他生成或更新记录的方法,则会.new引发错误.update.create

如果你想,你可以使用ActionController::Parameters#permit来确保参数是一个简单的标量类型(不是散列或数组):

params.permit(:search).fetch(:search, nil)

如果search是带有嵌套键的可选参数,您可以像这样将其列入白名单:

params.fetch(:search, {}).permit(:foo, :bar)

您还可以使参数成为必需参数,以便在缺少时引发 ActionController::ParameterMissing 异常:

params.require(:search).permit(:foo, :bar)

这就是你在 Rails 中 99% 的时间所做的事情,因为如果我们不能对请求做任何有意义的事情,它就会提前退出。


推荐阅读