参数错误:范围正文需要被调用

我正在通过“Ruby On Rails 3基本培训”工作,并且在使用名称范围时遇到了问题。 当findlogging和使用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) } 

其原因在于,它确保每次使用范围时都会评估块的内容。

我得到了同样的错误,而在我的解决scheme之前,我有一个空间之间和(如下图

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

之后我删除了之间的空间(如下面我做我的网页工作

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

是的,事实上,这是调用示波器的方式。 如果要从Rails 3升级到Rails 4,则需要更改它。

你正在使用的是: scope :visible, where(:visible => true)用于加载,并且在Rails 4中已经被弃用了。

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

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

有些情况下,这件事很重要,比如:

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

在第一种情况下, ? 将会被类加载的时间所替代,但是第二个正确的例子将被用于在该类上调用范围。