web-dev-qa-db-ja.com

初期化されていない定数「コントローラー名」

ルート/リソースおよびコントローラーでエラーが発生しています。

Routes.rbには次のものがあります。

# routes.rb
resources :users do  
  resource :schedule  
end

そして、私はそれがそうあるべきだと思うので、controllers/users /の中にschedule_controller.rbを設定しています:

class Users::ScheduleController < ApplicationController

  # Controller methods here...

end

Rake:routesショーの実行

user_schedule      POST   /users/:user_id/schedule(.:format)       schedules#create
new_user_schedule  GET    /users/:user_id/schedule/new(.:format)   schedules#new
edit_user_schedule GET    /users/:user_id/schedule/edit(.:format)  schedules#edit
                   GET    /users/:user_id/schedule(.:format)       schedules#show
                   PUT    /users/:user_id/schedule(.:format)       schedules#update

ただし、/ users /:user_id/scheduleに移動すると、次のエラーが返されます。

uninitialized constant SchedulesController

問題が何であるかについての私の唯一の考えは、それがネストされたリソースと関係があるか、単一のリソースを宣言していることであり、どこかで間違っています。

私はヘルパーを使用しています

new_user_schedule_path(current_user)

「新しい」ビューにリンクするとき。

15
Adam

Users::ScheduleControllerではなく、SchedulesControllerである必要があります。コントローラーは、ルートが namespaceで名前空間化 の場合にのみ名前空間化される必要があります。コントローラー名も常に複数にする必要があります。

作成しているのは、名前空間付きではなく nestedリソース です。

16
Andrew Marshall

SchedulesControllerのネームスペースは意図的ですか?つまり、reallyこれを行うつもりですか?

_class Users::SchedulesController < ApplicationController
_

それとも、スケジュールはユーザーからの「サブモノ」であるため、あなたはそれをしているだけですか?

私がこれを尋ねる理由は、通常、Rails内では、ネストされたリソースコントローラーare n't名前空間です。ネームスペースの下で特別な方法でコントローラーを変更する場合にのみ、コントローラーのネームスペースを作成します。これの一般的な例は、管理者のみがそれらのコントローラーにアクセスすることを制限する、その名前空間内のBaseControllerから継承する、管理名前空間の下にいくつかのコントローラーを持つことです。

オプション1

意図的ではないこのコントローラーの名前空間を使用する場合、コントローラーから_Users::_プレフィックスを削除し、それを_app/controllers/schedules_controller.rb_に戻し、ヘルパーを_app/helpers/schedules_helper.rb_および_app/views/schedules_に戻るビュー。おそらく_Users::Schedule_モデルも生成するジェネレーターを実行しましたが、これもScheduleに名前を変更し、_app/models/schedule.rb_に戻す必要があります。

オプション2

意図的に行ったこのコントローラーの名前空間の場合、ルートでこれを実行する必要があります。

_namespace :users do
  resources :schedules
end
_

生成されたものはすべてそのままにしておきます。

3
Ryan Bigg

Routes.rbで、次のようにコントローラーを指定する必要があります。

resources :users do resource :schedules, controller: 'users/shedules' end

2
Pshemski

リソース:usersを名前空間:usersに置き換えます

スケジュールコントローラーはユーザーフォルダー内にあるためです。 class Users :: ScheduleController <ApplicationController#ここにコントローラーメソッド... end

0
Hemant Kumar