我有一个类似于此的 Controller 操作:
def reports
puts params
@stats = Client.stats(params)
puts params
end
初始参数可能如下所示:
{ 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 对象,我可以看到它已被 self.stats 方法修改。
在上面的示例中,我没有在初始参数中发送“开始”,该方法将其添加用于计算 - 正如预期的那样。
没想到函数会修改原来的哈希值!
谁能解释为什么会这样?
--编辑--
我忘了说我试图创建参数的副本并使用它,同样的问题。
def reports
a = params
@stats = Client.stats(a)
puts params
end
参数还在更新?!
最佳答案
那是因为您的函数调用获取的是对参数的引用而不是副本。如果您执行类似 opts[:start] = (Time.now - 30.days).to_i
的操作,您正在编辑参数对象。
a = params
:现在两个变量都指向内存中的同一个位置。您只复制了指针。
Google 搜索 ruby object copy
或 ruby deep copy
或在 stackoverflow 上搜索。第一次尝试时,您可以尝试 params.clone
。
关于ruby - 在 Rails 中,为什么我的 Controller 参数被类修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36008252/