##実現したいこと
コメント機能のテストを実現したいです。
2日間、調べて修正しましたが実現できませんでした。
お手数をおかけ致しますがご理解がある方はヒントでもあれば、
お教えをお願い致します。
前提
作成された掲示板にコメントを投稿致します。
しかし、
コメントデータの設定ができず、下記のエラーメッセージが発生致しました。
発生している問題・エラーメッセージ
Failure/Error: params.require(:comment).permit(:board_id, :name, :comment) ActionController::ParameterMissing: param is missing or the value is empty: comment # ./app/controllers/comments_controller.rb:23:in `comment_params' # ./app/controllers/comments_controller.rb:3:in `create' # /usr/local/bundle/gems/rails-controller-testing-1.0.5/lib/rails/controller/testing/template_assertions.rb:62:in `process' # /usr/local/bundle/gems/rails-controller-testing-1.0.5/lib/rails/controller/testing/integration.rb:16:in `block (2 levels) in <module:Integration>' # ./spec/controllers/comments_controller_spec.rb:7:in `block (4 levels) in <top (required)>'
該当のソースコード
#####コメント投稿テストコード[comments_controller_spec.rb]
Rails
1require 'rails_helper' 2 3RSpec.describe CommentsController, type: :controller do 4 describe 'comment#create' do 5 context 'コメントを投稿が成功した場合' do 6 before do 7 post(:create, params: { 8 board: { 9 name: 'tanaka', 10 title: 'Ruby on Rails 5', 11 body: 'Hello Rails', 12 } 13 }) 14 15 @comment = FactoryBot.build(:comment) 16 post comments_path, params: { 17 board_id: @comment.board_id, 18 name: @comment.name, 19 comment: @comment.comment, 20 } 21 end 22 23 it '掲示板のコメント欄にリダイクトされること' do 24 expect(response).to redirect_to @comment.board 25 end 26 end 27 end 28end
#####コメント投稿機能[comments_controller.rb]
class CommentsController < ApplicationController def create comment = Comment.new(comment_params) if comment.save flash[:notice] = 'コメントを投稿しました。' redirect_to comment.board else flash[:comment] = comment flash[:error_messages] = comment.errors.full_messages redirect_back fallback_location: comment.board end end def destroy comment = Comment.find(params[:id]) comment.delete redirect_to comment.board, flash: { notice: 'コメントが削除されました。' } end private def comment_params params.require(:comment).permit(:board_id, :name, :comment) end end
#####掲示板関連機能[boards_controller.rb]
class BoardsController < ApplicationController # 各アクション実行前に動作、onlyの配列の順序に注意 before_action :set_target_board, only: %i[show edit update destroy] def index @boards = params[:tag_id].present? ? Tag.find(params[:tag_id]).boards : Board.all @boards = @boards.page(params[:page]) end def new @board = Board.new end def create board = Board.new(board_params) if board.save flash[:notice] = '「#{board.title}」の掲示板を作成しました。' redirect_to board else redirect_to new_board_path, flash: { board: board, error_messages: board.errors.full_messages } end end def show @comment = Comment.new(board_id: @board.id) end def edit @board.attributes = flash[:board] if flash[:board] end def update if @board.update(board_params) redirect_to @board # オブジェクトで記述すると、id指定で表示されるため。 else redirect_to :back, flash: { board: @board, error_messages: @board.errors.full_messages } end end def destroy @board.destroy redirect_to boards_path, flash: { notice: '「#{@board.title}」の掲示板が削除されました。' } end private def board_params # strongparameterで取得 params.require(:board).permit(:name, :title, :body, tag_ids: []) end # 1件分のレコードを取得 def set_target_board @board = Board.find(params[:id]) end end
#####rails routesの結果
mypage GET /mypage(.:format) users#me login POST /login(.:format) sessions#create logout DELETE /logout(.:format) sessions#destroy root GET / home#index users POST /users(.:format) users#create new_user GET /users/new(.:format) users#new boards GET /boards(.:format) boards#index POST /boards(.:format) boards#create new_board GET /boards/new(.:format) boards#new edit_board GET /boards/:id/edit(.:format) boards#edit board GET /boards/:id(.:format) boards#show PATCH /boards/:id(.:format) boards#update PUT /boards/:id(.:format) boards#update DELETE /boards/:id(.:format) boards#destroy comments POST /comments(.:format) comments#create comment DELETE /comments/:id(.:format) comments#destroy
試したこと
エラーメッセージの内容の通りに、テストコードのパラメータの内容が不足していると思い、
直接内容を記述。下記コード内容から修正作業を開始。
post(:create, params: { comment: { board_id: 1, name: 'tanaka', comment: 'こんにちは, } })
続いて、ルートで実施。
post comments_path, params: { board_id: 1, name: 'tanaka', comment: 'こんにちは, }
しかし、上記のテストコードの様に
FactoryBotでテストデータを作成後、実施するもエラーメッセージは同じ内容で失敗。
参考にした記事の一例
https://teratail.com/questions/271147
補足情報(FW/ツールのバージョンなど)
[作業環境]
macOS BigSur 11.2
Docker 20.10
Ruby 2.4.5
Rails 5.2.2
RSpec 3.9.0
回答2件
あなたの回答
tips
プレビュー