ruby-on-rails - 如何使用强参数等查询参数?
问题描述
如何使用查询参数作为强参数。这是前端调用的我的 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]',我应该怎么做。
解决方案
ActionController::Parameters
实际上只是一个像对象一样的哈希,“强参数”实际上相当于使用Hash#slice
只允许属性的白名单通过。这可以防止大规模分配攻击。初学者和经常有经验的 Rails 开发人员。似乎认为它神奇地过滤和清理参数。它没有——它只是防止你因为无知、愚蠢或懒惰而受到大规模注射攻击。
仅当您将参数哈希分配给模型时才需要白名单:
User.update(
params.permit(:email, :password)
)
在这种情况下,它可以防止恶意用户通过role=superadmin
或id=1
(因为第一个用户通常是管理员)。如果您只是从 params 哈希中分配单个属性,则不需要使用强属性。@permitted = true
2012 年引入的主要区别是白名单成为强制性的,因为如果您将没有属性的 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% 的时间所做的事情,因为如果我们不能对请求做任何有意义的事情,它就会提前退出。
推荐阅读
- c# - Dynamics CRM:强制 TLS 1.2 后出现 WCF 安全错误
- java - 运行 Appium 测试时找不到 APK 文件
- docker - docker-compose 中的网络模式容器
- fuzzy-logic - 模糊逻辑控制器 - RuntimeError:无法解析规则执行顺序
- python - 在 ctype 结构中使用无符号整数时报告无效 JSON
- python - 试图打印两对的概率
- sql - DB2 SQL 查询中的 ORDER BY 以匹配 Excel 中的排序
- python - wxpython对多个listctrls进行排序
- javascript - Puppeteer 从 a 中获取元素
- 结构体
- java - 创建强制用户制作 javadocs 的 Android Lint 检查。(像您向新开发人员解释一样解释)