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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

3回答

5577閲覧

Couldn't find User without an IDのエラーが出る

mayok

総合スコア12

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

1グッド

0クリップ

投稿2020/05/13 15:19

編集2020/05/14 12:58

前提・実現したいこと

ログインしているユーザーのプロフィールを表示させたいです。

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

ActiveRecord::RecordNotFound in UsersController#show Couldn't find User without an ID
Request Parameters: {"format"=>"6"}

該当のソースコード

(routes.rb) Rails.application.routes.draw do root 'static_pages#home' get 'user', to: 'users#show' get 'users', to: 'users#index' devise_for :users, controllers: { omniauth_callbacks: 'omniauth_callbacks', sessions: 'users/sessions', registrations: 'users/registrations', passwords: 'users/passwords' } devise_scope :user do get 'sign_in', to: 'users/sessions#new' get 'new_user_registraion', to: 'users/registrations#new' delete "sign_out", to: 'users/sessions#destroy' post 'users/guest_sign_in', to: 'users/sessions#new_guest' end resources :users resources :microposts end
(users_controller.rb) class UsersController < ApplicationController before_action :set_user, only: [:show, :edit, :update, :destroy] # GET /users # GET /users.json def index @users = User.all end # GET /users/1 # GET /users/1.json def show @user = User.find(params[:id]) end # GET /users/new # def new # @user = User.new # end # GET /users/1/edit def edit @user = User.find(params[:id]) end # POST /users # POST /users.json def create @user = User.new(user_params) respond_to do |format| if @user.save format.html { redirect_to @user, notice: 'User was successfully created.' } format.json { render :show, status: :created, location: @user } else format.html { render :new } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # PATCH/PUT /users/1 # PATCH/PUT /users/1.json def update respond_to do |format| if @user.update(user_params) format.html { redirect_to @user, notice: 'User was successfully updated.' } format.json { render :show, status: :ok, location: @user } else format.html { render :edit } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # DELETE /users/1 # DELETE /users/1.json def destroy @user.destroy respond_to do |format| format.html { redirect_to users_url, notice: 'User was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_user @user = User.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def user_params params.require(:user).permit(:name, :email) end end
(application.html.erb) <!DOCTYPE html> <html lang="ja"> <head> <title><%= yield(:title) %> | Contrail</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.13.0/css/all.css" integrity="sha384-Bfad6CLCknfcloXFOyFnlgtENryhrpZCe29RTifKEixXQZ38WheV+i/6YWSzkz3V" crossorigin="anonymous"> </head>  <body> <header> <%= render "shared/header" %> </header> <main> <%= render "shared/main" %> <%= yield %> </main> <footer class="fixed-bottom text-center text-muted py-4"> <%= render "shared/footer" %> </footer> <%= render "shared/js" %> </body> </html>
(application.html.erb内 _header.html.erb) <nav class="navbar sticky-top mb-4"> <%=link_to "Contrail", root_path, class: "navbar-brand text-monospace" %> <li> <%=link_to class: "fa-heart" do %> <i class="far fa-heart fa-lg"></i> <% end %> </li> <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="ナビゲーションの切替"> <i class="fas fa-bars fa-lg"></i> </button> <div class="collapse navbar-collapse text-left" id="navbarNavAltMarkup"> <% if user_signed_in? %> <ul class="navbar-nav"> <li class="signedin-item py-4"> <%= link_to user_path(current_user), class: "signedin-item text-decoration-none" do %> <i class="far fa-user-circle mr-2 nav-items"></i> プロフィール <% end %> </li> <li class="signedin-item"> <%= link_to "#", class: "signedin-item text-decoration-none" do %> <i class="fas fa-map-marker-alt mr-2 nav-items"></i> マップ <% end %> </li> <li class="signedin-item py-4"> <%= link_to users_path, class: "signedin-item text-decoration-none" do %> <i class="fas fa-check mr-2 nav-items"></i> ユーザー一覧 <% end %> </li> <li class="signedin-item pb-2"> <%= link_to destroy_user_session_path, method: :delete, class: "signedin-item text-decoration-none" do %> <span><i class="fas fa-power-off mr-2 nav-items"></i> ログアウト</span> <% end %> </li> <% else %> <li class="not-signedin-item pt-4 mb-3"> <%= link_to new_user_session_path, class: "not-signedin-item text-decoration-none" do %> <i class="fas fa-sign-in-alt mr-2 nav-items"></i> ログイン <% end %> </li> <li class="not-signedin-item mb-5"> <%= link_to users_guest_sign_in_path, method: :post, class: " not-signedin-item text-decoration-none" do %> <i class="fas fa-sign-in-alt mr-2 nav-items"></i> 簡単ログイン <% end %> </li> </ul> <% end %> </div> </nav>
(static_pages_controller.rb) class StaticPagesController < ApplicationController def home; end end

試したこと

・検索すると正しいルーティングが設定できていないことが原因であることが多かったため、ユーザー情報が引き渡せていないと思いlink_toの引数にインスタンス変数を代入しました。
結果は変化なしでした。

自分で調べた結果下記の二点もエラー解決に役立つ情報だと思います。どうコードを書き直せばよいか分かりませんでした。

発生しているエラーメッセージの項目でコードを載せた通り、パラメーターの値が"id" => "6"となるはずなのに"format" => "6"と出力されている。
追記:その際の挙動は以下になります

Started GET "/user.6" for ::1 at 2020-05-14 21:33:41 +0900 (0.7ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 (0.5ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC Processing by UsersController#show as Completed 500 in 20ms (ActiveRecord: 3.5ms | Allocations: 4928) ActiveRecord::RecordNotFound (Couldn't find User without an ID): app/controllers/users_controller.rb:70:in `set_user'

・ログインユーザーのプロフィールを表示するためリンクを押すと、URLが/user.1となってしまう。
正しくは/user/1となるべきではないのでしょうか?

補足情報(FW/ツールのバージョンなど)

mac OS catalina10.15.4
rails 6.2.1
ruby 2.6.3
devise 4.7.1

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

記載されているcodeだけから判断するとうまく行くはずです。
ですが、みな断片でかつviewはどのviewの断片なのかもわかりません。
「こう書いたのだからうまく行くはずだ」の部分だけ抜き取ったのではその外にある問題がわかりません。

載っている link_to のview名とその全体像を載せてください。
そのviewを呼び出すcontrollerを載せてください

追記
予想外のviewが!
<% if user_signed_in? %> の3行下の
<%= link_to user_path(@user.id), をclickすると
Parameters: {"format"=>"6"} となる、ということでしょうか?

このviewを呼び出すのはcontrollerのどのmethodですか?

投稿2020/05/13 23:13

編集2020/05/14 12:27
winterboum

総合スコア23324

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

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

mayok

2020/05/14 10:03

ご回答ありがとうございます。 確かに該当する一部のみ載せればいいと甘く考えておりました。 controllerとviewを全文載せましたのでご確認お願いします。
mayok

2020/05/14 12:43

<%= link_to user_path(@user.id) でidのメソッドエラーが出たので<%= link_to user_path(current_user)に直し、サーバーを再起動するとそのような動作をしています。 Usersコントローラーのshowメソッドを当てています。deviseのデフォルトの設定のまま動かしてしまっています。
winterboum

2020/05/14 12:47

users_controlllerのshowでこのviewを出力し、 その中の <%= link_to user_path(current_user) をclick すると Parameters: {"format"=>"6"} となる?
mayok

2020/05/14 12:56

すみません勘違いしていたようです。 リンクのあるヘッダーを含んだapplication.html.erbを出力しているのがStaticPagesコントローラーのhomeメソッドです。 プロフィールページへのリンクはUsersコントローラーのshowメソッドを使用しております。
winterboum

2020/05/14 21:07

ているエラーメッセージの項目でコードを載せた通り、パラメーターの値が"id" => "6"となるはずなのに"format" => "6"と出力されている。 追記:その際の挙動は以下になります とありますが、「以下」には "format" => "6"ってないですね、"format" => "6"ってどこから出てきた?
guest

0

自己解決

回答してくださったお二方ありがとうございました。
解決することができました。原因はルーティングの設定とリンクが正しくなかったことでした。

URLを表示した際、/users/(id)となるはずが/user/(id)となっておりルーティングを改めて見直したことで原因を発見することができました。

以下二箇所でコードを修正し、ログインユーザーのプロフィールを表示させることができたため解決済みとさせていただきます。
質問を読んでくださった方たちもありがとうございました。

(routes.rb) - get 'user', to: 'users#show' + get 'users/show'
(_header.html.erb) - <%= link_to user_path(current_user), class: "signedin-item text-decoration-none" do %> + <%= link_to current_user, class: "signedin-item text-decoration-none" do %>

投稿2020/05/14 15:14

mayok

総合スコア12

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

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

0

Paramsにidが無いということは、

<%= link_to user_path(@user.id), class: "signedin-item text-decoration-none" do %>

へ渡した@user.idがこの時点で既にデータid => 6となっていない可能性があります。
渡す時点で中身が無ければいくら渡しても意味がないので念の為確認をお願いします。

投稿2020/05/13 16:03

gnfreeworks

総合スコア306

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

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

mayok

2020/05/13 16:29

ご回答ありがとうございます。 session[:user_id]を出力した結果nilと返ってきました。@userの中身もnilになっていました。 念の為データベースにid=6のユーザーが格納されているか調べたところこちらは確認ができました。
gnfreeworks

2020/05/13 16:47 編集

@userの中身がnilはおかしいですよね。 Controllerのコードの中身はこれで全部でしょうか? 記載頂いている内容だけ判断するのであれば、 仮に今開いているページがindex.html.hamlだとすると、indexアクションがありません。 また、 ``` def set_user @user = User.find(params[:id]) end ``` とありますが、Controllerが呼ばれた時にこのメソッドを実行するという指示の記載がありません。 これだと`@user`に値がセットされず、当然中身はnilになってしまうかと思います。
mayok

2020/05/14 10:07

コメントをいただきcontrollerを全文載せ直しました。お手数ですがご確認お願いします。 showアクションの中にコードを追加すべきということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問