前提・実現したいこと
現在既存のポートフォリオに対して機能として管理者機能を追加しました。
その後、テストが通るか確認して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/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。