在Rails中,为什么我的控制器参数被类修改

时间:2016-03-15 10:11:42

标签: ruby ruby-on-rails-4

我的控制器动作与此类似:

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方法修改过。

在上面的例子中,我没有在初始参数中发送'start',该方法将其添加到计算中 - 正如预期的那样。

我没想到的是该函数会修改原始哈希值!

有人可以解释为什么会这样吗?

- 编辑 -

我忘了说我试图创建一个params的副本并使用相同的问题。

def reports
  a = params
  @stats = Client.stats(a)
  puts params
end

params还在更新吗?!

2 个答案:

答案 0 :(得分:4)

那就是,因为你的函数调用获得对params的引用而不是副本。如果您执行opts[:start] = (Time.now - 30.days).to_i之类的操作,则表示您正在编辑params对象。

a = params:现在两个变量都指向内存中的相同位置。您只复制了指针。

Google ruby object copyruby deep copy或在stackoverflow上搜索。第一次尝试时,您可以尝试params.clone

答案 1 :(得分:1)

每当你更新params的任何值时,请复制这样的params副本

  

a = params.clone

它将在内存中创建一个新元素

如果您喜欢这样,它将不会在内存中创建一个新元素,它将指向相同的内存

  

a = params

试试这个