web-dev-qa-db-ja.com

ルーティングエラー-初期化されていない定数

Rails 3.2.12でこれを修正できませんでした。

config/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'

app/controllers/authentication_controller.rb

class AuthenticationsController < ApplicationController
  ...
end

app/models/authentication.rb

class Authentication < ActiveRecord::Base
  ...
end

それは私の現在の知識で機能するはずだと思いますが、私が見逃しているものがあります。

私の親切な質問は、何が悪いのか教えてください。

ルーティングエラー

uninitialized constant AuthenticationsController

これは、http://localhost:3000/auth/facebook/signoutに表示されるメッセージです

31
Davit

Railsでは、クラス名と一致するファイル名が必要です。したがって、app/controllers/authentication_controller.rbの名前をapp/controllers/authentications_controller.rbに変更する必要があります。

49
alf

この質問には答えましたが、このエラーが発生している別のケースを見つけて、後世のためにここに記録したいと思いました。

Routes.rbファイルで、対応するコントローラーなしで2つの同様のルートが定義されている場合、初期化されていない定数エラーが発生します。

再現する手順:

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

resources:foobarsをroutes.rbに新しいスコープに追加します(注:foobarsリソースは、scaffoldの生成中にすでに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に移動しますto / app/controllers/super/foobars_controller.rb foobars_controller.rbがスーパーモジュールにあることを確認します。

class Super::FoobarsController < ApplicationController

Your.dev.server/foobars /に移動します。次のエラーが表示されます:Routing Error uninitialized constant FoobarsController

次に、routes.rbの先頭からresources:foobarsを削除します。

このエラーが発生する理由を理解するにはしばらく時間がかかりましたが、scaffoldを生成するとroutes.rbにエントリが追加されることに気づきませんでした

5
Jared Menard

あなたの特定の質問には答えませんが、routes.rbで次のような失敗を受け取りました。

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

に変更しました

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

スラッシュを削除すると問題が解決しました。

0
Nathan Pierce

私の場合、モジュールを足場にしたので、コントローラーのルートを既に開始しており、2回定義していました。そのため、重複するリソースルートの1つを削除することで問題が解決しました。

0
Tushar