参数错误:范围主体需要可调用
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 => true)
用于预加载,在 Rails 4 中已被弃用。
scope :visible, where(:visible => true)
这行代码在特定类被加载时被评估,不是在那个时候,这个scope
被调用。
在某些情况下,这件事确实很重要,例如:
scope :future, where('published_at > ?', Time.now)
scope :future, -> where('published_at > ?', Time.now)
在第一种情况下,?
将被替换为加载类的时间,但在第二种情况下,正确的情况下,将使用对类调用作用域的时间。
【讨论】:
以上是关于参数错误:范围主体需要可调用的主要内容,如果未能解决你的问题,请参考以下文章