質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1289閲覧

ユーザー削除機能の実装中に :id=>nil のエラーが発生したため、解決策をお伺いしたいです。

batabata

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/10 01:11

前提・実現したいこと

現在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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

<%= link_to "削除", user_path(@user), method: :delete, data: {confirm: "本当に削除しますか?"}, class: "btn btn-danger btn-sm btn-delete" %>

eachで回している変数はuserなので
user_path(@user) -> user_path(user)
ですね。

indexにはidが無いため、下記@userにはnilが入ります。
そのidでリンクしていたため、:id=>nilになっていました。
indexアクションの下記コードも必要ないため削除してください。
@user = User.find_by(id: params[:id])

投稿2020/09/10 06:49

編集2020/09/10 06:50
necocoa

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

no1knows

2020/09/10 08:05

あぁ、見落としていました。訂正ありがとうございます!
batabata

2020/09/13 10:43

necocoaさん ご返信が遅くなり申し訳御座いません。 こちら有難う御座います! ご指摘頂いた箇所を修正したところ、 無事エラー解消することができました!! 大変助かりました。。
guest

0

<%= link_to "削除", user_path(@user), method: :delete, ・・・ %>
とuser_pathのdeleteメソッドに@userを送っているので、メソッド側では@user.destroyで削除できると思います。

def destroy @user.destroy flash[:success] = "ユーザーを削除しました。" redirect_back(fallback_location: root_path) end

投稿2020/09/10 01:48

no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

batabata

2020/09/10 02:51

早々にご回答頂きまして有難う御座います! ご指摘頂きましたように、不要な部分は削除し下記のように修正したのですが、引き続き同じエラーが発生して、ユーザー一覧ページが開けない状況でした。。 【修正前】 def destroy @user = User.find_by(id: params[:id]) @user.destroy flash[:success] = "ユーザーを削除しました。" redirect_back(fallback_location: root_path) end 【修正後】 def destroy @user.destroy flash[:success] = "ユーザーを削除しました。" redirect_back(fallback_location: root_path) end
no1knows

2020/09/10 05:10

indexページに@usersが渡されていないことでエラーが出ています。 上記は修正後のままで下記を変更してみてください。 def index @user = User.find_by(id: params[:id]) ←もしかしたら削除してもいいのかも @users = User.all ←追加 end 上記でもエラーがでるようでしたら@usersの有無で条件分岐をしてあげればよいかと思います。
batabata

2020/09/10 05:44

ご丁寧に有難う御座います! ご指摘頂いた @users = User.all は before_action :user_admin, only: [:index, :destroy] によって既に反映されておりまして。。 (念のため、@users = User.allを追加してみましたが、それでも変わらずエラーが出てしまいました、、) 条件分岐についてですが、処理はどのようなイメージになりますでしょうか。。 度々恐れ入ります。
no1knows

2020/09/10 05:55

<% if @users %> <% @users.each do |user| %> <% end %> <% end %> とかですかね。 というかそもそもデバッグってやっていますか? どの時点でどんな値が入っているかを確認するとエラー解決がはかどりますよ! https://www.youtube.com/watch?v=5fyrGslhUcY&t=1061s
batabata

2020/09/13 10:40

ご返信遅れて申し訳御座いません。。 ご丁寧に動画URLのご共有有難う御座います! デバッグは行っているのですが、頂いた動画を再度見て理解深めてみます!! 有難う御座いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問