从params hash构造2个不同的URL,1覆盖另一个

时间:2012-03-09 14:35:31

标签: ruby-on-rails hash haml params

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

为了在控制器上创建这个URL,作为最后一步,我使用了params hash:

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 param添加到每个。

视图使用相同的代码显示它们,但在不同的TH中显示为:

%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

显示为(忽略此帖子的小时)

{"ratings"=>{"G"=>"1", "PG"=>"1"}, "sort"=>"title"} 
{"ratings"=>{"G"=>"1", "PG"=>"1"}, "sort"=>"title"} 

似乎最后添加的是守门员。即,标题是控制器动作代码中添加的最后一种,因此它是两个不同参数列表中的最后一个。

我不明白为什么params复制到两个不同的变量中就像是通过引用传递而不是传递值。我是Ruby的新手,但我之前在Ruby工作中没有看到过这个。

1 个答案:

答案 0 :(得分:0)

在Ruby中为has分配另一个变量时,分配引用,而不是散列的副本。因此,@titleparams@dateparams都会将相同的基础哈希引用为params本身。很明显,然后,您将:sort设置为"release_date",然后使用"title"覆盖。

尝试dup获取实际的副本

@titleparams = params.dup
@dateparams = params.dup