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

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

ただいまの
回答率

90.85%

  • Ruby

    6767questions

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

  • Ruby on Rails 5

    1102questions

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 106
退会済みユーザー

退会済みユーザー

前提・実現したいこと

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

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

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
<div class="sidetable">

    <table class="client_table client_side_table">
      <tr class="client_tr"><%= f.label :id, "id" %></tr>
      <tr class="client_tr"><%= f.text_field :id %></tr>
      <tr class="client_tr"><%= f.label :client_name, "企業名" %></tr>
      <tr class="client_tr"><%= f.text_field :client_name %></tr>
      <tr class="client_tr"><%= f.label :client_tel, "電話番号" %></tr>
      <tr class="client_tr"><%= f.text_field :client_tel %></tr>
      <tr class="client_tr"><%= f.label :attype_user_id, "***_ID" %></tr>
      <tr class="client_tr"><%= f.text_field :***_user_id %></tr>
      <tr class="client_tr"><%= f.label :***_user_password, "***_password" %></tr>
      <tr class="client_tr"><%= f.text_field :***_user_password %></tr>
    </table>
  </div>

    <div><%= f.submit "登録" %></div>
    <% end %>
  </div>
  <!-- ナビゲーション終了 -->

  <!-- メインカラム開始 -->
  <div id="client_content">
    <table class="client_table">
      <thead class="client_thread">
        <tr class="client_tr">
          <th class="client_th">id</th>
          <th class="client_th">企業名</th>
          <th class="client_th">電話番号</th>
          <th class="client_th">***_id</th>
          <th class="client_th">***_password</th>
          <th class="client_th"></th>
          <th class="client_th"></th>
        </tr>
      </thead>
      <tbody  class="client_tbody">
        <!-- <% binding.pry %> -->
        <% @clients.each do |client| %>
        <tr class="client_tr">
          <td class="client_td"><%= client.id %></td>
          <td class="client_td"><%= client.client_name %></td>
          <td class="client_td"><%= client.client_tel %></td>
          <td class="client_td"><%= client.***_user_id %></td>
          <td class="client_td"><%= client.***_user_password %></td>
          <td class="client_td"><%= link_to '編集', ("clients/:id/edit") %></td>
          <td class="client_td"><%= link_to '削除', ("clients/:id"), method: :delete, data: { confirm: '本当に削除しますか?' } %></td>
        </tr>
        <% end %>
      </tbody>
    </table>
  </div>
Rails.application.routes.draw do

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html


  resources :clients, except: [:show]
  get 'clients/index' => 'clients#index'
  post 'clients/index' => 'clients#index'

end

試したこと

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

補足情報

rails 5.1.4
MariaDB
vagrant
centos

お願い

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

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

resources :clients, except: [:show]

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

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

ここがマズいのでした。

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

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

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

とすればよいのでした。

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

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

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

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

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

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

ではなく

link_to '編集', edit_client_path(client)

と書きましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/22 15:48

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

    キャンセル

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

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    6767questions

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

  • Ruby on Rails 5

    1102questions

  • トップ
  • Rubyに関する質問
  • Couldn't find Client with 'id'=:id): paramsで受け渡しができません。ただ普通に削除機能つけたいだけです。