Rails 3 NameError(未初始化的常量<controllername>)</controllername>

时间:2012-02-12 21:01:02

标签: ruby-on-rails ruby-on-rails-3 routes nameerror uninitialized-constant

尝试访问控制器上的非资源操作时,我得到NameError uninitialized constant WorkoutLog

我的控制器如下所示:

class WorkoutLogController < ApplicationController
   def index
     # random code
   end

   def on_date
     # random code
   end
end

我的路线档案:

 match "workout_log/:date", :controller => "workout_log", :action => "on_date", :as => "log_on_date"
 match "workout_log", :controller => 'workout_log', :action => 'index'

然后我有一个我的link_to:

<%= link_to "View Log", log_on_date_path(:date => Date.today.strftime('%d-%B-%Y')), :remote => true, "data-type" => "html" %>

WorkoutLogController背后没有模型 - 它只是一个控制器。但是,我无法对on_date执行请求,因为它会引发以下错误:

NameError (uninitialized constant WorkoutLog):

当我运行rake routes时,它似乎很好,因为它会生成以下内容:

log_on_date        /workout_log/:date(.:format)                  {:controller=>"workout_log", :action=>"on_date"}
workout_log        /workout_log(.:format)                        {:controller=>"workout_log", :action=>"index"}

我无法解决问题所在(特别是在过去的夜晚试图解决之后)。 rails是否正在寻找与之关联的模型并且未能这样做?

1 个答案:

答案 0 :(得分:1)

我想出了这个问题。它与declarative_authorization有关 由于我没有100%复制代码,因此我从上面粘贴的控制器代码中遗漏了以下内容:

filter_resource_access

declarative_authorization将此用于资源丰富的路由 - 这不是我的情况。我已经把它切换到filter_access_to :all,它运行正常。我通过在模型中创建文件workout_log.rb来解决问题的根源:

class WorkoutLog
end

然后,当我向index和on_date操作发出请求时,它给出了一个错误,即它无法在WorkoutLog上找到ActiveModel方法,而这反过来又指向了WorkoutLogController上的过滤器。

如果你看一下例子&gt;控制器位于declarative_authorization page on GitHub,它将提供必要的信息。 希望这可以帮助其他有此问题的人!