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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

1508閲覧

missing required keys: [:id]

Engineer_traine

総合スコア17

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿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/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

自己解決

テストに

rails

1allow_any_instance_of(ActionDispatch::Request).to receive(:session) { { user_id: user.id } }

を追加することで解決できました。

投稿2021/12/04 08:38

Engineer_traine

総合スコア17

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

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

0

loginしていないのでは?
そのheaderがloginしていない状態でも通るのではないですか?
もしそうなら、if current_user でくるみましょう

投稿2021/12/04 07:54

編集2021/12/04 07:55
winterboum

総合スコア23567

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

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

Engineer_traine

2021/12/04 08:17

ログインしていな状態ではログインするよう促すような仕様になっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問