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

弃用警告:由于ActionController::Parameters不再从散列继承,所以散列的方法已弃用,并将在Rails 5.1中删除.使用这种不推荐的行为会expose 出潜在的安全问题.如果继续使用此方法,可能会在应用程序中创建一个可被利用的安全漏洞.相反,考虑使用这些未被记录的方法中的一种:http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html(从CulnnHyb头/数据/项目/门户/主干/APP/Helps/AppultuaHelpR.RB:114调用).

警告显示的线条如下所示:

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

正如你所见,我不是打to_hash.也许Rails是.也许还有别的Ruby .我无从得知,因为他们认为不值得提供堆栈跟踪.(专业提示-通常值得提供堆栈跟踪!)

所以不管怎样,我按照链接,计划找到一个替代品,和the merge method does not appear to be deprecated,但可能他们只是忘了记录不推荐的状态,所以我真的不能确定.

那我该怎么做才能弄清楚呢?

推荐答案

Use .to_h

根据a comment on the Rails PR的说法,你可以拨打.to_h获得一个安全的哈希值.

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

  • .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

但是,如果您先调用.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

所以:

  1. 始终使用.permit来白名单您期望的值
  2. 使用.to_h确保如果你忘记了第一步,什么都不会通过
  3. 如果你想要原始值,不要先打.permit再打.to_unsafe_hash
  4. 不要打.to_hash,因为现在这是不明确的

Ruby-on-rails相关问答推荐

Gemfile需要较新版本的依赖项

使用带有 Paper Trail gem 的子类

如何让删除链接响应 Rails 7 中的 turbo_stream 和 html?

如何在生成的 HTML 本身中显示部分名称

如何不需要rails/all?

ViewModel 和 Controller 有什么区别?

attr_accessible(*attributes) 和 attr_protected(*attributes) 有什么区别?

在 Rails 的 ActiveRecord 中,touch 有什么用?

Rails: WickedPDF: 分页符

安装mysql2(0.4.8)时出错,Bundler无法继续

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A

对于 Visual Studio 用户来说,最好的 Ruby on Rails 环境是什么?

如何在 Rails 迁移中添加判断约束?

在 factory_girl 中填充与 children 的关联

如何在 ROR (Ruby) 中显示 PDF?

Groovy/Grails :: Ruby/Rails :: 2011 框架状态

导轨链接到:远程

错误:无法在 Mavericks 上构建 gem 原生扩展

使用设计创建一个用户显示页面

在 Rails 中显示主机名和数据库名