我的方法很奇怪,只有命名参数。
class MyConsumer < ...
def method1(params)
method2(params.slice(:a,:b))
end
def method2(a:, b:)
# do something
end
end
我有针对method1的测试,并且工作正常。但是在制作时我得到ArgumentError: wrong number of arguments (given 1, expected 0)
例外。
我尝试添加
params = params[0] if params.instance_of?(Array)
作为method1
的第一行,认为它是使用数组而不是哈希调用的,但这没有帮助。
有关为什么在某些情况下调用带有hash.slice
的方法2并且不在其他情况下的方法的任何见解?
答案 0 :(得分:5)
ActionController::Parameters#slice
返回ActionController::Parameters
个实例,而不是哈希值。它像哈希一样嘎嘎叫,但它不是哈希值,因此无法按原样传递给方法,期待双重splat。
在传递之前明确地调用to_hash
:
method2(params.permit(:a,:b).to_hash)
请查看以下评论,了解其为permit
,而不是slice
。积分给@SimpleLime。