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

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

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

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

Q&A

解決済

2回答

1905閲覧

「ActiveRecord::RecordNotFound in MessagesController#index」「Couldn't find User with 'id'=」とエラーが出てしまう。

skem

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/17 11:07

編集2020/09/18 08:48

ツイッターのダイレクトメッセージのような感じで、メッセージやり取り機能を実装したいのですが、下記のエラーが出てしまいます。
イメージ説明

ルーティングは下記です。

Rails.application.routes.draw do devise_for :users root 'messages#index' resources :users, only: [:edit, :update] do resources :messages, only: [:index, :create] end end

コントローラーは下記です。

class MessagesController < ApplicationController before_action :set_user def index @message = Message.new @messages = @user.messages.includes(:user) end def create @message = @user.messages.new(message_params) if @message.save redirect_to user_messages_path(@user), notice: 'メッセージが送信されました' else @messages = @user.messages.includes(:user) flash.now[:alert] = 'メッセージを入力してください。' render :index end end private def message_params params.require(:message).permit(:content, :image).merge(user_id: current_user.id) end def set_user @user = User.find(params[:user_id]) end end

助言頂ければ幸いでございます。


【更新】

頂きました助言を元にデバッガ(binding.pry)を使い下記のように出ました。

26: def set_user => 27: binding.pry 28: @user = User.find(params[:user_id]) 29: end [1] pry(#<MessagesController>)> params => <ActionController::Parameters {"controller"=>"messages", "action"=>"index"} permitted: false> [2] pry(#<MessagesController>)> params[:user_id] => nil

「controller」というキーに対し「messages」という値が出ていることと、「action」というキーに対し、「index」という値が出ていることが、何を意味しているのか?

恐れ入りますが、助言を頂ければ幸いでございます。

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

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

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

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

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

guest

回答2

0

自己解決

ありがとうございます!kmdkuk様からのアドバイスもあり、無事解決に至りました。メッセージコントローラー内で、@userをcurrent_userに変更し、before_actionはindexを除外(ここではcreateのみ対象)に変更したところ通りました!

class MessagesController < ApplicationController before_action :set_user, only: %i[create] def index @message = Message.new @messages = current_user.messages.includes(:user) end

投稿2020/09/20 00:44

skem

総合スコア1

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

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

0

Couldn't find User with 'id'=
とエラーメッセージにある通り,params[:user_id]で指定したUserが作られていないのではないでしょうか?
また,作成したつもりなのにこのエラーが出ているのであれば,
デバッガなどを利用して,params[:user_id]が想定している値になっているかどうか確認してみてはいかがでしょうか.

投稿2020/09/17 18:20

kmdkuk

総合スコア141

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

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

skem

2020/09/18 08:50

ありがとうございます! デバッガ(binding.pry)を利用して作業してみました(※質問内容を更新しました)。 想定した値になっているかどうかの確認を進めたいと思います。
kmdkuk

2020/09/18 08:58

`<ActionController::Parameters {"controller"=>"messages", "action"=>"index"}`の部分ですが, controllerはリクエストが飛んできた先のコントローラ名,actionはそのリクエストをハンドリングしている,action名です,なので今回の結果で言うと,MessageController#indexにリクエストが飛んできていることを示しています. やはり,params[:user_id]がnilになってしまっているので,リクエストパラメータとしてuser_idを渡せていないようですね
skem

2020/09/19 03:00

ありがとうございます。[:user_id]を[:id]に変えるなどしてみたのですが、やはり渡せなかったので、ルーティングの方も確認してみます。
kmdkuk

2020/09/19 04:30

それは,ルーティングのパスにuser_idを含めようとしているってことなんですかね? ~/messages/:user_idみたいなのはRESTの観点からあまりよろしくないように思いますが, ~/messages?user_id=1みたいなリクエストを送ることでやりたいことが実現できるのかなと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問