34

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

配置/路由.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

应用程序/模型/身份验证.rb

class Authentication < ActiveRecord::Base
  ...
end

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

我的好问题是请告诉我出了什么问题。

路由错误

uninitialized constant AuthenticationsController

这是一条消息,显示在http://localhost:3000/auth/facebook/signout

4

5 回答 5

53

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

于 2013-04-06T00:13:35.713 回答
5

尽管已经回答了这个问题,但我发现了另一个我遇到此错误的情况,并想在此处记录它以供后代使用。

如果您在 routes.rb 文件中定义了两条相似的路由,但没有相应的控制器,您将收到未初始化的常量错误。

重现步骤:

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

资源 :foobars添加到 routes.rb 到新范围(注意: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/ 你应该得到这个错误: Routing Error uninitialized constant FoobarsController

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

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

于 2014-10-28T17:32:49.750 回答
0

虽然它没有回答您的具体问题,但我在 routes.rb 中收到了以下失败信息

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

我改成

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

删除斜线解决了我的问题。

于 2018-04-17T02:01:12.980 回答
0

就我而言,由于我为模块搭建了脚手架,因此它已经为控制器启动了路由,并且我定义了两次。因此,通过删除重复的资源路由之一解决了我的问题。

于 2019-09-06T13:41:20.900 回答
-1

确保您已经为相关控制器创建了模型。

于 2020-02-29T11:25:32.497 回答