欢迎来到cool的博客
7

Music box

Click to Start

点击头像播放音乐
新博客链接

当我们遇到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,因为现在这个模糊

返回列表