コメント機能を作成中にフォームから投稿したコメントが表示されない不具合があり、if @comment.saveにbinding.pryを
かけてみましたが反応せず、保存処理がなされていませんでした。
そこで、save!としてエラーメッセージを出力すると
[エラー文]Validation failed: "モデル" must exist となり、エラー文を検索すると
参考記事:https://qiita.com/tanaka7014/items/50a1a953b3f440cbe481とあったので
comment.rbのbelongs_toに'optional: true'を追加しました。
すると以下のようなエラー文に遭いました。データの保存に失敗していることは分かるのですが
それ以上エラー文を解釈できず、お力添えを頂ければと思います。
ActiveRecord::NotNullViolation in CommentsController#create SQLite3::ConstraintException: NOT NULL constraint failed: comments.community_id Extracted source __if @comment.save!__(エラー箇所) flash[:success] = "コメントしました" redirect_back(fallback_location: root_path) else
<comments_controller.rb>
class CommentsController < ApplicationController def create @comment = Comment.new(comment_params) @comment.user_id = current_user.id #上の2行だけではコメントをしたユーザーの関連付けをできないため書いています(コメントは誰のものなのか) if @comment.save! flash[:success] = "コメントしました" redirect_back(fallback_location: root_path) else flash[:success] = "コメントできませんでした" redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end
<communities_controller.rb>
lass CommunitiesController < ApplicationController before_action :set_community, only: [:edit,:show,:update] def index @communities = Community.all end def show @comments = @community.comments #投稿詳細に関連付けてあるコメントを全取得 @comment = Comment.new #投稿詳細画面でコメントの投稿を行うので、formのパラメータ用にCommentオブジェクトを取得 end def edit @community = Community.find(params[:id]) end def new @community = Community.new end def create @community = current_user.communities.build(community_params) if @community.save redirect_to community_path(@community), notice: "投稿に成功しました。" else render :new end end def update if @community.update(community_params) redirect_to community_path, notice: "投稿を更新しました。" else render :edit end end def destroy community = Community.find(params[:id]) community.destroy redirect_to communities_path, notice: "投稿を削除しました。" end private def community_params params.require(:community).permit(:title, :body, :image, :content) end def set_community @community = Community.find(params[:id]) end end
<comment.rb>
class Comment < ApplicationRecord belongs_to :user belongs_to :community # validates :content, presence: true, length: { maximum: 140 } end
<log>(コメント入力欄に”こんにちは”と入力)
Started POST "/communities/1/comments" for ::1 at 2021-02-12 18:18:15 +0900 (0.1ms) SELECT sqlite_version(*) Processing by CommentsController#create as HTML Parameters: {"authenticity_token"=>"OKAibpz00Oo96iCmc9a94tl22sqsMB1W9sLRkMYKDUiJzSSGgo6NTQfjJh19ZM/S6XBnlxe+KSB3Wkeb7kw2Yg==", "comment"=>{"content"=>"こんにちは"}, "commit"=>"コメントする", "community_id"=>"1"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/comments_controller.rb:4:in `create' (0.1ms) begin transaction ↳ app/controllers/comments_controller.rb:7:in `create' User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/comments_controller.rb:7:in `create' (0.1ms) rollback transaction ↳ app/controllers/comments_controller.rb:7:in `create' Completed 422 Unprocessable Entity in 27ms (ActiveRecord: 1.4ms | Allocations: 21086)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/12 14:10
2021/02/12 22:23
2021/02/13 06:03 編集
2021/02/13 06:05 編集
2021/02/13 06:26
2021/02/13 06:54
2021/02/13 08:50
2021/02/15 10:01