路由错误 - 未初始化的常量

时间:2013-04-06 00:06:11

标签: ruby-on-rails ruby rails-routing

我无法在Rails 3.2.12中解决这个问题,也许我错过了一些东西。

配置/ routes.rb中

get "home/index"
root :to => "home#index"
devise_for :users, :only => :omniauth_callbacks
match 'users/auth/:provider/callback' => 'authentications#create'
match '/auth/:provider/signout' => 'authentications#signout'

应用/控制器/ authentication_controller.rb

class AuthenticationsController < ApplicationController
  ...
end

应用/模型/ authentication.rb

class Authentication < ActiveRecord::Base
  ...
end

我认为它应该适用于我目前的知识,但有些东西我想念。

我的问题是告诉我哪里出了问题。

Rounting Error

uninitialized constant AuthenticationsController

此消息显示在http://localhost:3000/auth/facebook/signout

5 个答案:

答案 0 :(得分:49)

Rails要求文件名与类名匹配。因此,您应该将app/controllers/authentication_controller.rb重命名为app/controllers/authentications_controller.rb

答案 1 :(得分:5)

虽然这个问题已得到解答,但我发现了另一个案例,我收到了这个错误,并希望在此处记录后代。

如果您的routes.rb文件中定义了两个类似的路由而没有相应的控制器,您将获得未初始化的常量错误。

重现的步骤:

rails generate scaffold foobar name:string
bundle exec rake db:migrate

将routes.rb的资源:foobars 添加到新范围(注意:在脚手架生成期间,foobars资源已经自动添加到routes.rb的顶部),如下所示:

  resources :foobars

  ########################################
  # SUPER
  ########################################

  constraints host: ENV['SUPER_HOST'] do
    scope module: :super do
      resources :foobars
      get '/' => 'super#index'

    end
  end

现在,将 / app / views / foobars 移至 / app / views / super / foobars 并将 /app/controllers/foobars_controller.rb 移至 /app/controllers/super/foobars_controller.rb 确保foobars_controller.rb在Super模块中:

class Super::FoobarsController < ApplicationController

现在转到your.dev.server / foobars / 你应该得到这个错误: 路由错误未初始化的常量FoobarsController

现在,从routes.rb的开头删除资源:foobars 它现在应该工作了!

我花了一段时间弄清楚为什么我收到这个错误,我没有意识到生成脚手架会在routes.rb中添加一个条目

答案 2 :(得分:0)

虽然它没有回答您的具体问题,但我在路线中收到了以下错误.rb

resources :republishes  do
    post '/attempt_all', :to => 'republishes/#attempt_all' . . .

我改为

resources :republishes  do
    post '/attempt_all', :to => 'republishes#attempt_all' . . .

删除斜杠修复了我的问题。

答案 3 :(得分:0)

在我的情况下,由于我已经搭建了模块,因此它已经为控制器启动了路由,因此我定义了两次。因此,通过删除重复的资源路由之一解决了我的问题。

答案 4 :(得分:0)

确保已为有问题的控制器创建了模型。