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

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

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

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

解決済

missing required keys: [:id]

Engineer_traine
Engineer_traine

総合スコア17

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

2回答

0評価

0クリップ

240閲覧

投稿2021/12/04 06:28

前提・実現したいこと

現在既存のポートフォリオに対して機能として管理者機能を追加しました。
その後、テストが通るか確認してgitでpushしようと考えていたのですが通らず困っています。
具体的にはheaderに配置しているマイページの箇所がひかかっているようです。
ちなみに現在のコードでは一応、しっかりcurrent_userとしてのidを取得しマイページに遷移できます。
表示されているエラーの内容からidをうまく渡せていないのが原因のようですが(current_user)として
pathの最後に記載していますが間違っているようです。
どなたかわかる方いましたらご教授よろしくお願い致します。

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

Failure/Error: <%= link_to user_path(current_user) do %> ActionView::Template::Error: No route matches {:action=>"show", :controller=>"users", :id=>nil}, missing required keys: [:id]

該当のソースコード

require 'rails_helper' RSpec.describe "Caves", type: :request do describe "#new" do let(:cafe) { create(:cafe) } let(:user) { create(:user) } before do session_params = { session: { email: user.email, password: user.password } } post "/login", params: session_params end it 'カフェ登録画面の表示に成功すること' do get '/caves/new' expect(response).to have_http_status(200) end end describe "#create" do let(:cafe) { create(:cafe) } let(:user) { create(:user) } before do session_params = { session: { email: user.email, password: user.password } } post "/login", params: session_params end it 'カフェ作成に成功すること' do valid_params = { image: cafe.image, name: cafe.name, address: cafe.address, number_seats: cafe.number_seats } expect { post '/caves/new', params: { cafe: valid_params } } expect(response).to have_http_status(200) end end describe "#show" do let(:cafe) { create(:cafe) } let(:user) { create(:user) } before do allow_any_instance_of(ActionDispatch::Request).to receive(:session) { { user_id: user.id } } end it 'カフェ詳細画面の表示に成功すること' do get "/caves/#{cafe.id}" expect(response).to have_http_status(200) end end describe "#edit" do let(:cafe) { create(:cafe) } let(:user) { create(:user) } before do session_params = { session: { email: user.email, password: user.password } } post "/login", params: session_params end it 'カフェ編集画面の表示に成功すること' do get "/caves/#{cafe.id}/edit" expect(response).to have_http_status(200) end end describe "#update" do let(:cafe) { create(:cafe) } let(:user) { create(:user) } before do session_params = { session: { email: user.email, password: user.password } } post "/login", params: session_params end it 'カフェの編集に成功すること' do get "/caves/#{cafe.id}/edit" valid_params = { image: cafe.image, name: cafe.name, address: cafe.address, number_seats: cafe.number_seats } expect { put "/caves/#{cafe.id}", params: { cafe: valid_params } } expect(response).to have_http_status(200) end end end
<header> <%= link_to caves_path do %> <img src="/assets/logo.jpg" , alt="ロゴ画像"> <% end %> <div class="hamburger"> <span></span> <span></span> <span></span> <span></span> </div> <nav class="globalMenuSp"> <ul> <li> <%= link_to areas_show_path do %> <i class="fas fa-map"></i>エリア <% end %> </li> <li> <%= link_to new_cafe_path do %> <i class="fas fa-coffee"></i>カフェ登録 <% end %> </li> <li> <%= link_to user_path(current_user) do %> <i class="fas fa-user"></i>マイページ <% end %> </li> <li> <%= link_to logout_path, method: :delete do %> <i class="fas fa-sign-out-alt"></i>ログアウト <% end %> </li> </ul> </nav> </header>
Rails.application.routes.draw do get 'areas/show' resources :caves do resources :comments, only: [:create] resources :likes, only: [:create, :destroy] end get 'sessions/new' root 'home#top' resource :users, only: [:new, :create] do collection do get :likes end end resources :users, only: [:show, :edit, :update, :destroy] patch 'user', to: "users#update" get 'login', to: "sessions#new" post 'login', to: "sessions#create" delete 'logout', to: "sessions#destroy" post 'guest_login', to: "guest_sessions#create" # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html namespace :admin do resources :users end end
class UsersController < ApplicationController before_action :already_login?, only: [:new, :create] before_action :login?, only: [:show, :destroy, :edit, :update] def new @user = User.new end def show @user = User.find(params[:id]) end def create @user = User.new(user_params) if @user.save session[:user_id] = @user.id redirect_to caves_path, notice: "新規登録しました。" else render :new end end def edit @user = User.find(params[:id]) end def update if current_user.update(user_params) redirect_to user_path, notice: "編集しました。" else flash.now[:alert] = "編集に失敗しました。" render :edit end end def destroy @user = User.find(params[:id]) @user.destroy flash[:notice] = 'ユーザーを削除しました。' redirect_to admin_users_path end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end

試したこと

調べて実践したコードの変更なのですが、マイページの遷移のパスの箇所を
<%= link_to user_path(id: current_user) do %>
としてみましたがsystemのテストの方もエラーが発生してしまいました。

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

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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