如何解决弃用警告"方法to_hash已弃用,将在Rails 5.1中删除"

Tre*_*kaz 38 ruby ruby-on-rails ruby-on-rails-5

我正在尝试更新到Rails 5,我收到以下弃用警告:

弃用警告:方法to_hash已弃用,将在Rails 5.1中删除,因为ActionController::Parameters不再继承哈希.使用此弃用行为会暴露潜在的安全问题.如果您继续使用此方法,则可能会在您的应用中创建可被利用的安全漏洞.相反,请考虑使用其中一种未被弃用的文档化方法:http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html(从/ Data/Projects/portal/trunk/app中的column_header调用) /helpers/application_helper.rb:114)

警告所在的行如下所示:

    link_to(name,
            {
              action: action_name,
              params: params.merge({ order: key, page: nil })
            },
            {
              title: "Sort by this field",
            }) +
Run Code Online (Sandbox Code Playgroud)

如你所见,我不是在打电话to_hash.也许Rails是.也许其他一些宝石.我无从谈论,因为他们认为不值得提供堆栈跟踪.(临提示-它通常值得提供一个堆栈跟踪!)

所以无论如何,我跟着链接,打算找一个替代品,并且merge方法不会出现被弃用,但也许他们只是忘了记录弃用状态,所以我真的不能确定.

那么我应该做些什么来清除这个呢?

Nat*_*ong 67

使用 .to_h

.to_h根据对Rails PR的评论,你可以打电话来获得一个安全的哈希.

现在有三种方法可以将参数转换为哈希值.

  • .to_h意思是"如果我没有打电话.permit,假设什么都不允许."
  • .to_unsafe_h意思是"如果我没有打电话.permit,假设一切都被允许."
  • .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
Run Code Online (Sandbox Code Playgroud)

但是,如果您先拨打电话.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
Run Code Online (Sandbox Code Playgroud)

所以:

  1. 始终用于.permit将您期望的值列入白名单
  2. 使用.to_h以确保如果您忘记第1步,什么都不会得到通过
  3. 如果你真的想要原始值,请不要打电话.permit和打电话.to_unsafe_hash
  4. 不要打电话,.to_hash因为现在这是模棱两可的

  • @ sandre89问题说:“我收到以下弃用警告...(详细信息)那么我应该怎么做才能清除此问题?” (2认同)