当我们遇到params permit问题使用 | Method: ActionController::Parameters#to_unsafe_h
Method: ActionController::Parameters#to_unsafe_h
- Defined in:
- actionpack/lib/action_controller/metal/strong_parameters.rb
permalink#to_unsafe_h ⇒ ObjectAlso known as: to_unsafe_hash
Returns an unsafe, unfiltered ActiveSupport::HashWithIndifferentAccess
representation of the parameters.
params = ActionController::Parameters.new({
name: "Senjougahara Hitagi",
oddity: "Heavy stone crab"
})
params.to_unsafe_h
# => {"name"=>"Senjougahara Hitagi", "oddity" => "Heavy stone crab"}
把Parameters 对象转换成 hash
[10] pry(main)> params.class => ActionController::Parameters [11] pry(main)> params.to_unsafe_h.class => ActiveSupport::HashWithIndifferentAccess
使用.to_h
根据a comment on the Rails PR,您可以调用.to_h来获取安全的哈希值。
现在有三种将参数转换为散列的方法。
> .to_h意思是“如果我没有打电话,认为没有允许。”
> .to_unsafe_h意思是“如果我没有打电话,假设一切都是允许的。”
> .to_hash现在是模糊的。 Rails对待它像.to_unsafe_h,但是打印一个警告,因为你没有明确说明你想要的两个选项中的哪一个。
首先,我们来看看如果没有调用.permit,会发生什么。在Rails 5.0控制台中:
> params = ActionController::Parameters.new({yes: "y", no: "n"})
> params.to_h
{} # empty hash because nothing has been permitted
> params.to_unsafe_h
{"yes"=>"y", "no"=>"n"} # raw values with no warning; you asked for it
> params.to_hash
# (puts deprecation warning - if you want unsafe values, say so)
{"yes"=>"y", "no"=>"n"} # returns raw values
但是,如果首先调用.permit,将无法获得不允许的值。
> params = ActionController::Parameters.new({yes: "y", no: "n"})
> params = params.permit(:yes)
# (puts warning about unpermitted parameter :no)
> params.to_h
{"yes"=>"y"} # permitted values only
> params.to_unsafe_h
{"yes"=>"y"} # permitted values only
> params.to_hash
# (puts deprecation warning, but still safe)
{"yes"=>"y"} # permitted values only
所以:
>始终使用.permit将您期望的值列入白名单
>使用.to_h确保如果你忘记了第1步,没有任何东西会通过
>如果你真的想要原始值,不要调用.permit并调用.to_unsafe_hash
>不要调用.to_hash,因为现在这个模糊