参数错误:范围主体需要可调用

Posted

技术标签:

【中文标题】参数错误:范围主体需要可调用【英文标题】:Argument Error: The scope body needs to be callable 【发布时间】:2015-05-11 04:18:50 【问题描述】:

我正在完成“Ruby On Rails 3 基本培训”,但在使用名称范围时遇到了问题。在使用 Rails 控制台查找记录和使用查询时,一切都很顺利,直到我尝试在 subject.rb 文件中使用名称范围。这是我在 subject.rb 文件中的代码。

Class Subject < ActiveRecord::Base

  scope :visible, where(:visible => true)

end   

我保存了 .rb 文件并重新启动了我的 Rails 控制台,但是当我从我的 rails 控制台运行时:

subjects = Subject.visible

我得到:ArgumentError: The scope body needs to be callable.

有谁知道我为什么会收到这个错误。

【问题讨论】:

【参考方案1】:

作用域的主体需要包裹在诸如 Proc 或 Lambda 之类的可调用对象中:

scope :visible, -> 
  where(:visible => true)

这样做的原因是它确保每次使用范围时都会评估块的内容。

【讨论】:

好的,这是有道理的,我迫不及待地想明天早上尝试一下,这样我就可以继续学习了。感谢您及时的回复。任何关于为什么教练在他的例子中没有使用任何包装的猜测。这似乎对他有用。我还注意到最新版本的 ruby​​ 不使用:“self.up”“self.down”标签。讲师说 ruby​​ 在较新的版本中不需要它,但我必须包含它才能使迁移工作。由于制作了培训视频,因此当有不同版本的 rails 时会让人感到困惑。再次感谢。 @SamGruse 这是Rails 4的做法,课程好像用Rails 3【参考方案2】:

是的,确实,这是 rails 4 调用范围的方式。如果您要从 Rails 3 升级到 Rails 4,则需要更改它。

【讨论】:

【参考方案3】:

我遇到了同样的错误,而在我的解决方案之前,我在 where( 之间有一个空格,如下所示

scope :registered , ->  where ( place_id:  :place_id , is_registered: :true ) 

在我删除where( 之间的空格后,如下所示,我的页面正常工作

scope :registered , ->  where( place_id:  :place_id , is_registered: :true ) 

【讨论】:

【参考方案4】:

您使用的是:scope :visible, where(:visible =&gt; true) 用于预加载,在 Rails 4 中已被弃用。

scope :visible, where(:visible => true)

这行代码在特定类被加载时被评估,不是在那个时候,这个scope被调用

在某些情况下,这件事确实很重要,例如:

scope :future, where('published_at > ?', Time.now)
scope :future, ->  where('published_at > ?', Time.now) 

在第一种情况下,? 将被替换为加载类的时间,但在第二种情况下,正确的情况下,将使用对类调用作用域的时间。

【讨论】:

以上是关于参数错误:范围主体需要可调用的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义类型作为输入参数放入可调用语句中

[C++11]可调用对象绑定器

使用可调用参数重载可调用对象

友点企业建站-小程序支付提示“参数配置错误”

创建函数,向范围添加参数

可调用实例参数的表示法是啥?