前提・実現したいこと
現在、rails tutorialを学習しているプログラミング初心者です。
第11章まで進んだのですが、rails testを実行してみたところエラーが多すぎてどこから手をつけて良いのか、また、どこが間違っているのかわからなくなってしまいました。
発生している問題・エラーメッセージ
ERROR["test_should_redirect_destroy_when_not_logged_in", UsersControllerTest, 0.39628575800088583] test_should_redirect_destroy_when_not_logged_in#UsersControllerTest (0.40s) AbstractController::ActionNotFound: AbstractController::ActionNotFound: The action 'destroy' could not be found for UsersController test/controllers/users_controller_test.rb:18:in `block (2 levels) in <class:UsersControllerTest>' test/controllers/users_controller_test.rb:17:in `block in <class:UsersControllerTest>' ERROR["test_should_redirect_index_when_not_logged_in", UsersControllerTest, 0.43351379099840415] test_should_redirect_index_when_not_logged_in#UsersControllerTest (0.43s) NoMethodError: NoMethodError: undefined method `logged_in_user' for #<UsersController:0x00007f2e99172400> Did you mean? logged_in? test/controllers/users_controller_test.rb:12:in `block in <class:UsersControllerTest>' ERROR["test_should_redirect_destroy_when_logged_in_as_a_non-admin", UsersControllerTest, 0.5090885159988829] test_should_redirect_destroy_when_logged_in_as_a_non-admin#UsersControllerTest (0.51s) AbstractController::ActionNotFound: AbstractController::ActionNotFound: The action 'destroy' could not be found for UsersController test/controllers/users_controller_test.rb:26:in `block (2 levels) in <class:UsersControllerTest>' test/controllers/users_controller_test.rb:25:in `block in <class:UsersControllerTest>'
該当のソースコード
require 'test_helper' class UsersControllerTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) @other_user = users(:archer) end test "should redirect index when not logged in" do get users_path assert_redirected_to login_url end test "should redirect destroy when not logged in" do assert_no_difference 'User.count' do delete user_path(@user) end assert_redirected_to login_url end test "should redirect destroy when logged in as a non-admin" do log_in_as(@other_user) assert_no_difference 'User.count' do delete user_path(@user) end assert_redirected_to root_url end end
以下、users_controllersのコードです。
destroyの項目があるのにエラーが出てしまっております。
class UsersController < ApplicationController before_action :logged_in_user, only: [:index, :edit, :update, :destroy] before_action :correct_user, only: [:edit, :update] before_action :admin_user, only: :destroy def index @users = User.paginate(page: params[:page]) end def show @user = User.find(params[:id]) end def new @user = User.new end def create @user = User.new(user_params) if @user.save log_in @user flash[:success] = "Welcome to the Sample App!" redirect_to @user else render 'new' end end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if @user.update_attributes(user_params) flash[:success] = "Profile updated" redirect_to @user else render 'edit' end def destroy User.find(params[:id]).destroy flash[:success] = "User deleted" redirect_to users_url end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end # beforeアクション # ログイン済みユーザーかどうか確認 def logged_in_user unless logged_in? store_location flash[:danger] = "Please log in." redirect_to login_url end end # 正しいユーザーかどうか確認 def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) end # 管理者かどうか確認 def admin_user redirect_to(root_url) unless current_user.admin? end end end
以下、rails routesコマンドを実行した結果になります。
ec2-user:~/environment/sample_app (account-activation) $ rails routes Prefix Verb URI Pattern Controller#Action sessions_new GET /sessions/new(.:format) sessions#new users_new GET /users/new(.:format) users#new root GET / static_pages#home help GET /help(.:format) static_pages#help about GET /about(.:format) static_pages#about contact GET /contact(.:format) static_pages#contact signup GET /signup(.:format) users#new login GET /login(.:format) sessions#new POST /login(.:format) sessions#create logout DELETE /logout(.:format) sessions#destroy users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy edit_account_activation GET /account_activations/:id/edit(.:format) account_activations#edit
ほかにもエラーが発生しているのですが、抜粋して質問させていただきました。
ご教示の程よろしくお願いいたします。
英語ですが、エラーメッセージを読んでみましょう。
UsersController に destroy というアクションがないよ、と書かれています。
この情報だけで解決できない場合は、自身が作成した users_controller.rb も質問文に掲載してみてはいかがでしょう。
ありがとうございます!controllerは書かれているようですね!
そうすると、今度は、routes.rbも確認してみるとどうでしょうか?
`rails routes`コマンドを実行しても確認するか、localhost:3000/rails/infoにアクセスして確認すると確実かと思います。(誤記にも気づける)
ちなみにこの他にもErrorやFailが出ているのですが、全部載せたほうが分かりやすかったりするのでしょうか?