Создайте 2 разных URL из хэша params, один перезаписывает другой - PullRequest
0 голосов
/ 09 марта 2012

На мой взгляд, у меня есть 2 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 будут отдельными копиями параметров. Затем я добавляю параметры сортировки к каждому.

Представление отображает их с тем же кодом, но с разными 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"} 

Кажется, последний добавляемый тип - это хранитель. То есть заголовок был последним видом, добавленным в код действия контроллера, поэтому он является последним в двух разных списках параметров.

Я не понимаю, почему копирование параметров в две разные переменные действует как передача по ссылке вместо передачи по значению. Я новичок в Ruby, но я не видел этого раньше в своей работе над Ruby.

1 Ответ

0 голосов
/ 09 марта 2012

Когда вы присваиваете значение has другой переменной в Ruby, вы присваиваете ссылку, а не копию хэша. Таким образом, @titleparams и @dateparams оба ссылаются на тот же хэш, что и сам params. Понятно, что вы устанавливаете :sort на "release_date", а затем перезаписываете "title".

Попробуйте dup, чтобы получить действительную копию :

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