ruby - 在 Rails 中,为什么我的 Controller 参数被类修改

标签 ruby ruby-on-rails-4

我有一个类似于此的 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 copyruby deep copy 或在 stackoverflow 上搜索。第一次尝试时,您可以尝试 params.clone

关于ruby - 在 Rails 中,为什么我的 Controller 参数被类修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36008252/

相关文章:

ruby - 如何在 Sequel ORM 中将行作为数组(而不是哈希)获取?

ruby - 为 TextMate 安装 RSpec Bundle

ruby - 更改纯 ruby (不是铁轨)的时区

ruby-on-rails - Rails 4 中关于匹配关键字在 Rails 3 中工作的路由问题

ruby - 找到哈希值最高的 N 个键,保持顺序

javascript - 代码编辑器 API(带有行号)和代码高亮器

ruby-on-rails - Rails 4 to_json 产生意外异常 nil 不是符号

css - 从 html 转换为 rail

ruby-on-rails - rails : HOST Header Attack vulnerability

ruby-on-rails - Rails 4 搜索多个参数