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

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

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

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

Ruby

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

Q&A

解決済

1回答

977閲覧

Couldn't find Client with 'id'=:id): paramsで受け渡しができません。ただ普通に削除機能つけたいだけです。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2017/12/21 08:06

###前提・実現したいこと
登録企業を一覧ページから削除を行おうとしております。
エラー文で探してみたものの解消されません。

###発生している問題・エラーメッセージ

ActiveRecord::RecordNotFound (Couldn't find Client with 'id'=:id):

###Controller

class ClientsController < ApplicationController def index @clients = Client.all @client = Client.new end def edit @client = Client.new end def create @client = Client.new(client_params) if @client.save flash[:notice] = "クライアント登録が完了しました" redirect_to("/clients/index") else flash.now[:error] = 'クライアント登録に失敗しました' render :index end end def update end def destroy @client = Client.find(params[:id]) @client.destroy flash[:success] = "クライアントを削除しました" redirect_to("/clients/index") end private def client_params params.require(:client).permit(:id, :client_name, :client_tel, :***_user_id, :***_user_password) end end

View

1<div class="sidetable"> 2 3 <table class="client_table client_side_table"> 4 <tr class="client_tr"><%= f.label :id, "id" %></tr> 5 <tr class="client_tr"><%= f.text_field :id %></tr> 6 <tr class="client_tr"><%= f.label :client_name, "企業名" %></tr> 7 <tr class="client_tr"><%= f.text_field :client_name %></tr> 8 <tr class="client_tr"><%= f.label :client_tel, "電話番号" %></tr> 9 <tr class="client_tr"><%= f.text_field :client_tel %></tr> 10 <tr class="client_tr"><%= f.label :attype_user_id, "***_ID" %></tr> 11 <tr class="client_tr"><%= f.text_field :***_user_id %></tr> 12 <tr class="client_tr"><%= f.label :***_user_password, "***_password" %></tr> 13 <tr class="client_tr"><%= f.text_field :***_user_password %></tr> 14 </table> 15 </div> 16 17 <div><%= f.submit "登録" %></div> 18 <% end %> 19 </div> 20 <!-- ナビゲーション終了 --> 21 22 <!-- メインカラム開始 --> 23 <div id="client_content"> 24 <table class="client_table"> 25 <thead class="client_thread"> 26 <tr class="client_tr"> 27 <th class="client_th">id</th> 28 <th class="client_th">企業名</th> 29 <th class="client_th">電話番号</th> 30 <th class="client_th">***_id</th> 31 <th class="client_th">***_password</th> 32 <th class="client_th"></th> 33 <th class="client_th"></th> 34 </tr> 35 </thead> 36 <tbody class="client_tbody"> 37 <!-- <% binding.pry %> --> 38 <% @clients.each do |client| %> 39 <tr class="client_tr"> 40 <td class="client_td"><%= client.id %></td> 41 <td class="client_td"><%= client.client_name %></td> 42 <td class="client_td"><%= client.client_tel %></td> 43 <td class="client_td"><%= client.***_user_id %></td> 44 <td class="client_td"><%= client.***_user_password %></td> 45 <td class="client_td"><%= link_to '編集', ("clients/:id/edit") %></td> 46 <td class="client_td"><%= link_to '削除', ("clients/:id"), method: :delete, data: { confirm: '本当に削除しますか?' } %></td> 47 </tr> 48 <% end %> 49 </tbody> 50 </table> 51 </div> 52

Routes

1Rails.application.routes.draw do 2 3 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 4 5 6 resources :clients, except: [:show] 7 get 'clients/index' => 'clients#index' 8 post 'clients/index' => 'clients#index' 9 10end 11

###試したこと
コンソールにて Client.find(1)など直接入力するとちゃんと拾ってきます。

###補足情報
rails 5.1.4
MariaDB
vagrant
centos

###お願い
プログラミング初心者です。質問させていただいてる部分以外にも
おかしなところがあればご指摘いただけると幸いです。
何卒、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「削除」のリンクがどんな HTML になっているかをブラウザーで見てみましょう。

あるいは「削除」のリンクをクリックしたあとログを見て,どんな URL でアクセスしてきたかを見てみましょう。

rb

1resources :clients, except: [:show]

で定義される destroy アクションのパスは clients/:id の形をしているはずで,この :id のところは実際の URL では正の整数になるはずです。

ところが link_to の第二引数に "clients/:id" という文字列を渡しているので,これがそのまんまパスになっちゃうわけですね。

ここがマズいのでした。

destroy アクションのパスは show アクションと同じなのですが,今の場合,client_path(client) で生成することができます。

つまり,「削除」のリンクを

rb

1link_to '削除', client_path(client), method: :delete, data: { confirm: '本当に削除しますか?' }

とすればよいのでした。

この client_path というのはルーティング定義に基づいて定義されるメソッドです。引数には Client のインスタンスを入れます。

なのですが,実はもっとサボって

rb

1link_to '削除', client, method: :delete, data: { confirm: '本当に削除しますか?' }

と書いてもいいんです。(簡潔なのでこちらを推奨)
慣れないと不思議な感じがしますが,モデルオブジェクトを渡すと,そのモデルの show アクションのパスでリンクが生成される,という仕様です。

ついでに言うと,「編集」のリンクも

rb

1link_to '編集', ("clients/:id/edit")

ではなく

rb

1link_to '編集', edit_client_path(client)

と書きましょう。

投稿2017/12/21 13:21

scivola

総合スコア2108

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

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

退会済みユーザー

退会済みユーザー

2017/12/22 06:48

ありがとうございます。おかげ様で無事解決しました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問