Ruby on rails 在所需参数中合并时出现url\u帮助程序错误

Ruby on rails 在所需参数中合并时出现url\u帮助程序错误,ruby-on-rails,ruby,url,ruby-on-rails-5,actioncontroller,Ruby On Rails,Ruby,Url,Ruby On Rails 5,Actioncontroller,我试图将一个值合并到params散列中,并将结果散列传递给url帮助器。(使用Rails 5) 比如说。我有以下路线 routes.rb get 'test-url/:arg_1' => 'test#test_action_1', :as => 'test_test_action_one' get 'test-url/:arg_1/:arg_2' => 'test#test_action_2', :as => 'test_test_action_two' 用户访问/te

我试图将一个值合并到params散列中,并将结果散列传递给url帮助器。(使用Rails 5)

比如说。我有以下路线

routes.rb

get 'test-url/:arg_1' => 'test#test_action_1', :as => 'test_test_action_one'
get 'test-url/:arg_1/:arg_2' => 'test#test_action_2', :as => 'test_test_action_two'
用户访问
/test url/value-1
,我想在视图中生成一个链接,指向
/test url/value-1/value-2

在视图文件中

link_to test_test_action_two_url(params.permit(:arg_1).merge(arg_2: 'value-2'))
我得到以下错误:

No route matches {:action=>"test_action_2", :arg_1=>"value-1", "arg_1"=>"value-1", "arg_2"=>"value-2", :controller=>"test"} missing required keys: [:arg_2]
在引擎罩下,
ActionController::Parameters
对象正在维护一个内部散列(具有不同的访问权限)。在
合并
之后,哈希仍然具有不同的访问权限,您可以使用符号或字符串访问
arg_2


但是,我不确定为什么url生成器找不到
:arg_2
键…

ActionController::Parameters
使用
hashWithInferenceAccess
将键存储为字符串而不是符号。但是路由URL帮助程序要求参数位于符号键中。因此,正如错误中提到的,
arg_2
需要位于符号键中

尝试创建新的普通哈希:

test_test_action_two_path({arg_1: "value_1", arg_2: "value_2"})

我不知道为什么要在params散列上使用permit(它打算在ActiveRecord模型上用于设置属性)。为什么不仅仅是:
test\u test\u action\u两个路径(arg\u 1:params[:arg\u 1],arg_2:'value-2'}
?在Rails 5中,试图从未清理的请求参数生成URL时,可能会出现此错误
。攻击者可以将恶意数据注入生成的URL,例如更改主机。白名单并清理传递的参数以确保安全。
如果我传入多个参数,我宁愿执行操作e> 参数切片(x,y,z)抛出上述错误,但将参数散列传递给路由器url\u助手确实有效。只有在执行合并时,它才会停止工作。无论HashWithInferenceAccess是否在内部将键存储为
字符串
,您仍然可以使用符号或字符串访问值。是的,当您访问这些值时同样,你可以用符号访问它们。你知道url\u助手是如何访问这些值的吗?这看起来像是
hashWithInferenceAccess
中的一个bug,顾名思义,你如何访问这些值并不重要。