前提・実現したいこと
現在Railsで投稿アプリを作っています。
ユーザーの削除機能(管理権限を持つユーザーのみ使用可能)を実装中に以下のエラーメッセージが発生したので、恐れ入りますが解決方法をご教示頂けますと幸いです。
具体的には、管理者のみが見られるユーザー一覧ページのユーザー削除ボタンから、
任意のユーザーを削除する機能を実装したいと考えています。
エラーを見ると、:id=>nilとなっているため、どのユーザーを削除するのか指定できていないのかと思い、色々調べてみたのですがエラーが解消されずという状況です。
発生している問題・エラーメッセージ
ActionController::UrlGenerationError in Users#index No route matches {:action=>"destroy", :controller=>"users", :id=>nil}, missing required keys: [:id]
該当のソースコード
↓users/index.html.erb↓
<div class="mt-5"> <% @users.each do |user| %> <div class="px-5 mt-2 d-flex"> <h4>ID:<%= user.id %> | ユーザー名:<%= user.name %></h4> <%= link_to "削除", user_path(@user), method: :delete, data: {confirm: "本当に削除しますか?"}, class: "btn btn-danger btn-sm btn-delete" %> </div> <% end %> </div>
↓controllers/users_controller.rb↓
class UsersController < ApplicationController before_action :require_user_logged_in, only: [:index, :show] before_action :user_admin, only: [:index, :destroy] def index @user = User.find_by(id: params[:id]) end def show @user = User.find(params[:id]) @posts = @user.posts.order(id: :desc).page(params[:page]) @favorites = current_user.favorite_posts.includes(:user) end def new @user = User.new end def create @user = User.new(user_params) if @user.save flash[:success] = "ユーザー登録が完了しました。" redirect_to login_url else flash.now[:danger] = "ユーザー登録に失敗しました。" render :new end end def destroy @user = User.find_by(id: params[:id]) @user.destroy flash[:success] = "ユーザーを削除しました。" redirect_back(fallback_location: root_path) end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end def user_admin @users = User.all if current_user.admin == false redirect_to root_path else render action: "index" end end end
↓config/routes.rb↓
Rails.application.routes.draw do root to: "toppages#index" get "login", to: "sessions#new" post "login", to: "sessions#create" delete "logout", to: "sessions#destroy" resources :users, only: [:index, :new, :create, :show] do delete :destroy, on: :member end resources :posts, only: [:index, :new, :create, :destroy] do get :search, on: :collection end resources :favorites, only: [:create, :destroy] end
↓$ rails routes↓
Prefix Verb URI Pattern Controller#Action root GET / toppages#index login GET /login(.:format) sessions#new POST /login(.:format) sessions#create logout DELETE /logout(.:format) sessions#destroy user DELETE /users/:id(.:format) users#destroy users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new GET /users/:id(.:format) users#show search_posts GET /posts/search(.:format) posts#search posts GET /posts(.:format) posts#index POST /posts(.:format) posts#create new_post GET /posts/new(.:format) posts#new post DELETE /posts/:id(.:format) posts#destroy favorites POST /favorites(.:format) favorites#create favorite DELETE /favorites/:id(.:format) favorites#destroy rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs#show rails_blob_representation GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/10 08:05
2020/09/13 10:43