У меня есть действие контроллера несколько похожее на это:В Rails, почему мой контроллер PARAMS модифицируется классом
def reports
puts params
@stats = Client.stats(params)
puts params
end
Исходной PARAMS может выглядеть следующим образом:
{ end: '2012-01-01 21:00:19' }
И в моя модель клиента, у меня есть следующее:
def self.stats(opts)
opts[:start] = (Time.now - 30.days).to_i
...do some calculations..
return stats
end
Если я проверяю объект params, который был отправлен до и после забавы ction работает, я вижу, что он был изменен методом self.stats.
В приведенном выше примере я не отправляю «начальный» исходный параметр, метод добавляет его для вычислений - как и ожидалось.
Я не ожидал, что функция изменит исходный хэш!
Может кто-нибудь объяснить, почему это происходит?
--EDIT--
Я забыл сказать, что я пытался создать копию Params и использования, что вместо этого, тот же вопрос.
def reports
a = params
@stats = Client.stats(a)
puts params
end
Параметры все еще обновляются!
Связанный: http://stackoverflow.com/questions/22827566/ruby-parameters-by-reference-or-by-value/22827949#22827949 – nathanvda
Просто добавив, что, вероятно, хорошей практикой никогда не изменять параметры для метода. Это будет путать вызывающего абонента этого метода. – froderik
Почему * не будет * он изменяет то, что вы проходите? Создание новой ссылки на тот же объект не создает новый объект, он создает новую ссылку. Возможно, вы хотите клонировать или глубоко клонировать объект? –