Создайте 2 разных URL-адреса из хэша параметров, 1 перезаписывает другой

На мой взгляд, мне нужно создать 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

Отображается как (игнорируя hr для этого поста)

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

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

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


person DFBerry    schedule 09.03.2012    source источник


Ответы (1)


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

Попробуйте dup получить актуальную копию:

@titleparams = params.dup
@dateparams = params.dup
person Chowlett    schedule 09.03.2012
comment
Спасибо. Это очень помогло. - person DFBerry; 09.03.2012