在我的模板模型中我有
# models/template.rb
class Template < ActiveRecord::Base
scope :recent, -> { order('created_at DESC') }
end
我尝试拨打以下电话:
# views/template/_template_sidebar.haml
- Template.recent.each do |template|
%h2= template.title
我收到以下错误:
undefined method `recent' for ActionView::Template:Class
我可以做我想做的事情吗?如果我使用实例变量而不是更好吗?我避免使用后一种建议,因为我觉得它会产生额外的复杂性。
答案 0 :(得分:0)
由于this previously existing rails class,Template
应该是保留的类名。作为一种解决方法,我使用了以下调用。
- ::Template.recent.each do |template|
%h1= template.title
感谢@D-side对评论中的建议。
答案 1 :(得分:0)
您拥有自己的Template
课程。但也有ActionView::Template
。
视图在ActionView
实例的上下文中执行(您可以通过在其中查看binding.pry
并查看self
来验证该视图)。当你使用裸Template
时,Ruby在最近的范围中查找它,从你所在的范围(ActionView
)上升。
因此,它首先查找ActionView
,导致ActionView::Template
突然出现。的糟糕。强>
要解决此问题,假设您不想对当前类执行任何操作,请明确指定“Template
来自根范围”,::Template
即为。