我正在完成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.
有谁知道我为什么会收到此错误。
答案 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;正确的情况,将使用该时间在该类上调用范围的时间。