我正在发布:
{'a': 1, 'b': 2}
其中a键总是必需的,b键是可选的。如何使用Rails强参数语法要求a并允许b?params.require(:a).permit(:b)不起作用...
a
b
params.require(:a).permit(:b)
zfycwa2u1#
你正在成为初学者常见误解的牺牲品。ActionController::Parameters#require的作用不是验证参数的存在,而是在参数的结构与预期输入完全不匹配时尽早退出,验证通常由Rails中的模型完成。例如,当您拥有典型的Rails参数白名单时:
ActionController::Parameters#require
def thing_parameters params.require(:thing) .permit(:foo, :bar, :baz) end
如果params[:thing]为nil,继续处理请求并尝试更新/创建一个东西是没有意义的,因此我们提前退出并返回一个400 Bad Request状态代码。
params[:thing]
1sbrub3j2#
我相信你可以用其他方法解决,使用干验证
require 'dry-validation' class TableContract < Dry::Validation::Contract params do required(:a).filled(:bool) optional(:b).maybe(:string) end end
现在你可以从你的控制器使用那个契约
TableContract.new.call( a: params[:a], b: params[:b])
更多信息:https://dry-rb.org/gems/dry-validation/1.8/
2条答案
按热度按时间zfycwa2u1#
你正在成为初学者常见误解的牺牲品。
ActionController::Parameters#require
的作用不是验证参数的存在,而是在参数的结构与预期输入完全不匹配时尽早退出,验证通常由Rails中的模型完成。例如,当您拥有典型的Rails参数白名单时:
如果
params[:thing]
为nil,继续处理请求并尝试更新/创建一个东西是没有意义的,因此我们提前退出并返回一个400 Bad Request状态代码。1sbrub3j2#
我相信你可以用其他方法解决,使用干验证
现在你可以从你的控制器使用那个契约
更多信息:https://dry-rb.org/gems/dry-validation/1.8/