ActionView中定义范围的NoMethodError

时间:2016-01-17 13:49:17

标签: ruby-on-rails

在我的模板模型中我有

# 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

我可以做我想做的事情吗?如果我使用实例变量而不是更好吗?我避免使用后一种建议,因为我觉得它会产生额外的复杂性。

2 个答案:

答案 0 :(得分:0)

由于this previously existing rails classTemplate应该是保留的类名。作为一种解决方法,我使用了以下调用。

 - ::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即为。