前提・実現したいこと
railsでポートフォリオを作成しており、Rspecでテスト実行したところ以下のようなエラーが出ておりもしわかる方がいればご教授いただきたいです。
発生している問題・エラーメッセージ
1) 投稿管理機能 詳細表示機能 ユーザーAがログインしているとき ユーザーAが作成した投稿が表示される Failure/Error: visit post_path(post_a) NoMethodError: undefined method `set_post' for #<PostsController:0x000055c74078ad90> Did you mean? set_response! # /usr/local/bundle/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/etag.rb:25:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/head.rb:12:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/rack/logger.rb:38:in `call_app' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/rack/logger.rb:26:in `block in call' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/rack/logger.rb:26:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/runtime.rb:22:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/engine.rb:524:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/builder.rb:153:in `call' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/mock_session.rb:29:in `request' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/test.rb:266:in `process_request' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/test.rb:129:in `custom_request' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/test.rb:58:in `get' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/browser.rb:65:in `process' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/browser.rb:43:in `process_and_follow_redirects' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/browser.rb:23:in `visit' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/driver.rb:45:in `visit' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/session.rb:276:in `visit' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>' # ./spec/system/posts_spec.rb:38:in `block (4 levels) in <top (required)>' Finished in 7.73 seconds (files took 10.2 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/system/posts_spec.rb:41 # 投稿管理機能 詳細表示機能 ユーザーAがログインしているとき ユーザーAが作成した投稿が表示される
該当のソースコード
rails
1require 'rails_helper' 2 3RSpec.describe '投稿管理機能', type: :system do 4 let(:user_a) { create(:user, name: 'ユーザーA', email: 'a@example.com') } 5 let(:user_b) { create(:user, name: 'ユーザーB', email: 'b@example.com') } 6 let!(:post_a) { create(:post, name: '最初の投稿', user: user_a ) } 7 8 before do 9 visit login_path 10 fill_in 'メールアドレス', with: login_user.email 11 fill_in 'パスワード', with: login_user.password 12 click_button 'ログインする' 13 end 14 15 describe '一覧表示機能' do 16 context 'ユーザーAがログインしている時' do 17 let(:login_user) { user_a } 18 19 it 'ユーザーAが作成した投稿が表示される' do 20 expect(page).to have_content '最初の投稿' 21 end 22 end 23 24 context 'ユーザーBがログインしているとき' do 25 let(:login_user) { user_b } 26 27 it 'ユーザーAが作成した投稿が表示されない' do 28 expect(page).to have_no_content '最初の投稿' 29 end 30 end 31 end 32 33 describe '詳細表示機能' do 34 context 'ユーザーAがログインしているとき' do 35 let(:login_user) { user_a } 36 37 before do 38 visit post_path(post_a) 39 end 40 41 it 'ユーザーAが作成した投稿が表示される' do 42 expect(page).to have_content '最初の投稿' 43 end 44 end 45 end 46end
試したこと
自分の見解としてpost_aがちゃんと定義されていないのかと思い、サンプルコードと見比べましたが特にずれているところもなかったので見当がつかなくなってきたので質問させていただきました。
もしわかる方いればご教授お願いいたします。
undefined method `set_post' for #<PostsControlle
とありますので、controllerのcodeを開示いただくのが解決が早いです
返信が遅くなりました。
ご指摘ありがとうございます。
以下該当のコントローラー のコードです
rails posts_controller.rb
class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destroy]
def index
@posts = current_user.posts.order(created_at: :desc)
end
def show
end
def new
@post = Post.new
end
def create
@post = current_user.posts.new(post_params)
if @post.save
redirect_to @post, notice: "投稿「#{@post.name}」を登録しました。"
else
render :new
end
end
def edit
end
def update
@post.update!(post_params)
redirect_to posts_url, notice: "投稿「#{post.name}」を更新しました。"
end
def destroy
@post.destroy
redirect_to posts_url, notice: "投稿「#{post.name}」を削除しました。"
end
private
def post_params
params.require(:post).permit(:name, :description)
def set_post
@post = current_user.posts.find(params[:id])
end
end
end
ローカル環境では正常に機能は動作するのですがset_postが定義されていないと言うことでしょうか?
回答1件
あなたの回答
tips
プレビュー