Ruby on rails 从params散列构造2个不同的URL,1覆盖另一个

Ruby on rails 从params散列构造2个不同的URL,1覆盖另一个,ruby-on-rails,hash,haml,params,Ruby On Rails,Hash,Haml,Params,在我看来,我需要创建两个URL。每个都有一个单独的排序值,但必须包括以前的所有分级设置 为了在控制器上创建此URL,作为最后一步,我使用params散列: params.delete :controller params.delete :action params.delete :commit params.delete :utf8 params[:ratings] = @ratings @titleparams = params @dateparams = params @datepar

在我看来,我需要创建两个URL。每个都有一个单独的排序值,但必须包括以前的所有分级设置

为了在控制器上创建此URL,作为最后一步,我使用params散列:

params.delete :controller
params.delete :action
params.delete :commit
params.delete :utf8

params[:ratings] = @ratings

@titleparams = params
@dateparams = params

@dateparams[:sort] = "release_date" 
@titleparams[:sort] = "title"
我希望@titleparams和@dateparams是params的单独副本。然后我将sort参数添加到每个

视图以相同的代码显示它们,但以不同的方式显示,如下所示:

%a#release_date_header= link_to "Release Date", movies_path(@dateparams)

%a#title_header= link_to "Movie Title", movies_path(@titleparams)
我在页面顶部还有一个部分,可以查看@dateparams和@titleparams将在页面中显示的内容。他们是一样的,我不明白为什么

%hr
=@titleparams
%hr
=@dateparams
%hr
显示为(忽略此职位的人力资源)

看来最后要加的是守门员。即,标题是控制器操作代码中添加的最后一个排序,因此它是两个不同参数列表中的最后一个


我不明白为什么参数复制到两个不同的变量中的行为就像通过引用传递,而不是通过值传递。我是Ruby新手,但我以前在Ruby工作中没有见过这种情况。

当您在Ruby中为另一个变量分配has时,您分配的是引用,而不是哈希的副本。因此
@titleparams
@dateparams
都引用与
参数本身相同的底层散列。很明显,您将
:排序
设置为
“发布日期”
,然后用
“标题”
覆盖

尝试
dup
获取实际副本:


非常感谢。这帮了大忙。
{"ratings"=>{"G"=>"1", "PG"=>"1"}, "sort"=>"title"} 
{"ratings"=>{"G"=>"1", "PG"=>"1"}, "sort"=>"title"} 
@titleparams = params.dup
@dateparams = params.dup