2012-03-09 26 views
0

在我看来,我有2个我需要创建的URL。每种类型都有单独的排序值,但必须包含以前的所有评级设置。从params散列构造2个不同的URL,1覆盖另一个

为了创建这个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的单独副本。然后我为每个添加排序参数。

的视图显示他们具有相同的代码,但在不同的THS为:

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

%a#title_header= link_to "Movie Title", movies_path(@titleparams) 

我也有在页面顶部的部分,看看有什么@dateparams和@titleparams是来页以查看。他们是一样的,我不明白为什么。

%hr 
[email protected] 
%hr 
[email protected] 
%hr 

显示为(这个职位忽略小时)

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

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

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

回答

0

当你在Ruby中为另一个变量赋值一个变量时,你指定了引用,而不是散列的一个副本。所以@titleparams@dateparams都引用与params本身相同的底层哈希。很明显,那么,您将:sort设置为"release_date",然后用"title"覆盖。

尝试dup得到一个实际复制

@titleparams = params.dup 
@dateparams = params.dup 
+0

谢谢。这帮了很多。 – DFBerry 2012-03-09 14:52:22