当前位置: 首页 > 知识库问答 >
问题:

如何解决弃用警告“Method to\u hash已弃用,将在Rails 5.1中删除”

计均
2023-03-14

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

弃用警告:哈希的方法已弃用,将在Rails 5.1中删除,因为ActionController::Parameters不再从哈希继承。使用这种不推荐的行为会暴露出潜在的安全问题。如果继续使用此方法,则可能会在应用程序中创建可被利用的安全漏洞。相反,请考虑使用以下未被弃用的有文档记录的方法之一:http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html(从列标题调用,位于/Data/Projects/portal/trunk/app/helpers/application\u helper.rb:114)

警告所在的行如下所示:

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

正如您所看到的,我不是在调用\u hash。也许Rails是。也许还有别的宝石。我无从得知,因为他们认为不值得提供堆栈跟踪。(专业提示-通常值得提供堆栈跟踪!)

因此,无论如何,我遵循了链接,计划找到一个替代方法,并且合并方法似乎没有被弃用,但可能他们只是忘记记录弃用状态,所以我不能确定。

那我该怎么做才能清除这个?

共有1个答案

陆宏扬
2023-03-14

您可以调用。to_h以获取安全哈希,根据Rails PR的评论。

现在有三种将参数转换为哈希的方法。

  • <代码>。to\u h的意思是“如果我没有调用。permit,假设不允许任何操作。”
  • <代码>。to\u unsafe\u h的意思是“如果我没有调用。permit,请假定一切都是允许的。”
  • <代码>。to\u哈希现在不明确。Rails将其视为<代码>。,但会打印一条警告,因为您尚未明确说明您想要上述两个选项中的哪一个

首先,让我们看看如果没有调用,会发生什么。允许 。在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

但是,如果调用。允许首先,无法获取不允许的值。

> 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. 始终使用.准许将您期望的值列入白名单
  2. 使用。to_h确保如果您忘记了第1步,则不会通过
  3. 如果您真的想要原始值,请不要调用。许可并调用。to_unsafe_hash
  4. 不要打电话给。to_hash因为那现在含糊不清

 类似资料:
  • 问题内容: DeprecationWarning:需要一个整数(got类型为float)。不建议使用隐式转换为整数,并且在将来的Python版本中可能会删除隐式转换。 DeprecationWarning:需要一个整数(got类型为float)。不建议使用隐式转换为整数,并且在将来的Python版本中可能会删除隐式转换。 问题答案: 警告与的坐标参数有关。浮点坐标将表示的原点位于窗口像素之间。那没

  • 问题内容: 我正在使用react-navigation实现2个屏幕。但是导航到第二页时出现以下警告: 警告:isMounted(…)在纯Javascript类中已弃用。相反,请确保在componentWillUnmount中清除订阅和未决请求,以防止内存泄漏。 版本: 反应:16.3.1 反应本机:0.55.2 反应导航:1.5.11 效用:0.10.3 Login.js Home.js 我在这里

  • 就在最近,上下文。getResources()。updateConfiguration()在Android API 25中已被弃用,我需要更改用户选择的应用程序的语言。我正在使用此方法更改语言 但由于受到了不推荐的api警告,我刚刚开始android开发。因此,任何建议都将有助于解决此警告。

  • 我们有一个Java项目。我们为javac启用了Xlint(启用警告)和Werror(将警告视为错误)标志,以确保我们的代码没有警告。最近我们决定不推荐一个类。问题是在某些情况下,SuppressWarnings(“弃用”)根本不会抑制弃用警告,从而导致生成失败。下面是我遇到的用例列表: > 在其他未弃用的类中导入。 在其他已弃用的类中导入。 家长班。 类型参数。例如 但是,即使没有“抑制”,此选项

  • 问题内容: 我刚刚更新到Django v1.8,并在更新项目之前测试了本地设置,并且发出了弃用警告,这是我从未见过的,对我也没有任何意义。我可能只是忽略了某些内容或误解了文档。 现在,这对我提出了3个问题。 根据文档,Options.app_label除非模型不在应用程序模块之外,否则不是必需的,在我看来,不是这样。其次,无论如何,此行为在1.7中已被弃用,那么为什么它甚至成为问题? 这些应用程序

  • 问题内容: 我有一个React组件,我想在单击时切换一个CSS类。 所以我有这个: 这个问题是ESLint不断告诉我“ this.refs”已贬值。 我该怎么办?我如何解决它而不使用折旧的代码? 问题答案: 您要引用的Lint规则称为 no-string-refs, 并通过以下方式警告您: 之所以收到此警告,是因为已实现了不赞成使用的使用方式(通过使用字符串)。根据您的React版本,您可以执行以