Argument Error: The scope body needs to be callable

Argument Error: The scope body needs to be callable

我正在研究 'Ruby On Rails 3 Essential Training',在使用名称范围时遇到了问题。在 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.

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

作用域的主体需要包裹在可调用的东西中,例如 Proc 或 Lambda:

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

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

是的,确实,这是 rails 调用作用域的 4 种方式。如果您要从 Rails 3.

升级到 Rails 4,则需要更改它

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

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

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

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

您正在使用什么:scope :visible, where(:visible => true) 用于预加载,并且在 Rails 4 中已被弃用。

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

这行代码在加载特定 class 时被评估,而 当时没有,这 scope 被称为

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

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

在第一种情况下,? 将被替换为 class 加载的时间,但第二种情况也是正确的情况,该时间将被用于加载范围在 class.

上被调用