0

我的模型中有范围,如下所示:

scope :public, -> { another_scope.where(v_id: 1) }

当我在测试中存根这个模型时:

model.stub(:test).and_return(test)

它将一个值传递给这个范围,所以我收到

wrong number of arguments (1 for 0)

我怎样才能避免这种情况?当我将其更改为:

scope :public, ->(arg) { another_scope.where(v_id: 1) }

它工作正常,但从未使用过 arg

当我不使用 lambda ex 时,它也可以正常工作:

scope :public, another_scope.where(v_id: 1)
4

1 回答 1

1

使用Proc而不是 lambda。

scope :public, proc{ another_scope.where( v_id: 1 ) }

lambdas 是一种“严格”的过程,需要适量的参数。

或者,如果你想保留 'stabby lambda' 语法,这里有一个小技巧(虽然它不那么可读,而且看起来奇怪地让我不安,就像一个微型的索伦之眼):

scope :public, ->(*){ another_scope.where( v_id: 1 ) }

splat 的功能与在方法签名中使用它时完全相同def foo( *args ); end,除了 args 不会被捕获在变量中。

于 2013-05-14T13:30:19.760 回答