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

时间:2015-03-09 21:01:42

标签: ruby-on-rails ruby-on-rails-3 scope argument-error

我正在完成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.

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

4 个答案:

答案 0 :(得分:74)

范围的主体需要包含在像Proc或Lambda这样可调用的东西中:

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:0)

您正在使用的是: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) } 将被替换为加载类的时间,但第二个&amp;正确的情况,将使用该时间在该类上调用范围的时间。