我很遗憾在Rails 2.3.18上运行应用程序,并且在控制器中看到了params变量的奇怪行为。应用程序的某些区域(出于某种原因)默认情况下将params分配给自身或空哈希。
params = (params || {})
现在,params变量被初始化为请求参数,因此它应该在逻辑表达式中求值为true。但是,在这种情况下,params设置为{}。为什么会发生这种情况?
答案 0 :(得分:2)
我没有使用Rails 2.3应用程序,但控制器中的params
实际上是方法,但是说params = ...
会创建一个隐藏标准params
的局部变量方法。例如,请在irb
:
def x
puts 'x is being called'
{ :where_is => 'pancakes house?' }
end
x = x || { }
并且您会看到x
为{ }
且x
方法甚至从未被调用过。代码说:
params = (params || {})
实际上是这样做的:
params = nil # Declare a local variable and initialize it to nil
params = params || { }
# -------^^^^^^ the local variable above, not the method
但是,如果强制RHS params
成为方法调用:
params = params() || { }
# -------------^^
然后它应该调用该方法,但你仍然在赋值的LHS上有本地params
变量。
我认为您需要弄清楚代码为什么会params = params || { }
并重构它以便它不是必需的。当这些控制器方法实际上不在控制器中时,它们是否会尝试工作?它们是否依赖于旧版Ruby中的狡猾边缘情况?这些代码是否被某人从他们不理解的博客中复制神秘代码添加了货物崇拜风格?