我正在尝试更新到Rails 5,我收到以下弃用警告:
DEPRECATION WARNING:方法to_hash已弃用,将在Rails 5.1中删除,因为
ActionController::Parameters
不再继承哈希值。使用此弃用行为会暴露潜在的安全问题。如果您继续使用此方法,则可能会在您的应用中创建可被利用的安全漏洞。相反,请考虑使用其中一个未弃用的文档化方法:http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html(从/Data/Projects/portal/trunk/app/helpers/application_helper.rb:114中的column_header调用)
警告所在的行如下所示:
link_to(name,
{
action: action_name,
params: params.merge({ order: key, page: nil })
},
{
title: "Sort by this field",
}) +
如你所见,我没有打电话给to_hash
。也许Rails是。也许其他一些宝石。我无从谈论,因为他们认为不值得提供堆栈跟踪。 (专业提示 - 通常 值得提供堆栈跟踪!)
所以无论如何,我按照链接,计划找到替换,the merge
method does not appear to be deprecated,但也许他们只是忘记记录弃用状态,所以我真的不能确定。
那么我应该做些什么来清除这个?
答案 0 :(得分:63)
.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
所以:
.permit
将您期望的值列入白名单.to_h
确保如果您忘记了第1步,则无法通过.permit
并致电.to_unsafe_hash
.to_hash
因为现在不明确