前提・実現したいこと
ログインしているユーザーのプロフィールを表示させたいです。
発生している問題・エラーメッセージ
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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/14 10:03
2020/05/14 12:43
2020/05/14 12:47
2020/05/14 12:56
2020/05/14 21:07