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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby on Rails 6

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

Q&A

解決済

2回答

571閲覧

@comment.saveができない

Asahi_sun_

総合スコア5

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/09/06 14:53

編集2020/09/07 14:14

前提・実現したいこと

rails6 でSNSを作成中、投稿に対するコメント機能を実装中です。
コメントコントローラーに以下のように記述し、books(投稿)のshowページにコメントの投稿フォームを作成しています。しかしコメントを送信しようとすると必ず@comment.save が失敗してflashの”失敗”が表示されてしまいます。

class CommentsController < ApplicationController def create @comment = current_user.comments.new(comment_params) if @comment.save flash[:success] = "成功" redirect_back(fallback_location: root_path) else flash[:danger] = "失敗" redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end

ログの記載

Started POST "/books/303/comments" for 126.36.208.218 at 2020-09-06 14:41:42 +0000 Cannot render console from 126.36.208.218! Allowed networks: 127.0.0.0/127.255.255.255, ::1 (0.1ms) SELECT sqlite_version(*) Processing by CommentsController#create as HTML Parameters: {"authenticity_token"=>"q+QVqM97YBjBQSNBKBx4y0pcifU5iXCP805YIwLbF+s5o1GgAWEf7hT7/xxmWxXbX3WmD0oGzQpvRzFVuNG8LQ==", "user_id"=>"1", "comment"=>{"content"=>"こめ"}, "commit"=>"返信", "book_id"=>"303"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:8:in `current_user' Redirected to https://12dac388e20f4c1f9f6629019404d368.vfs.cloud9.us-east-2.amazonaws.com/books/303 Completed 302 Found in 33ms (ActiveRecord: 1.5ms | Allocations: 20459)

該当のソースコード

routes.rb

Rails.application.routes.draw do root 'static_pages#home' get '/home', to: 'static_pages#home' get '/help', to: 'static_pages#help' get '/signup', to: 'users#new' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do get :following, :followers end end resources :books, only: [:show, :create, :destroy] do resources :likes, only: [:create, :destroy] resources :comments, only: [:create] end resources :relationships, only: [:create, :destroy] end

bookモデル

belongs_to :user has_many :likes has_many :liked_user, through: :likes, source: :user has_many :comments has_many :commented_user, through: :comments, source: :user

commentモデル

class Comment < ApplicationRecord belongs_to :user belongs_to :book validates :content, presence: true end

booksコントローラー

def show @user = User.find(params[:id]) @books = @user.books.paginate(page: params[:page]) @like = Like.new end

commentコントローラー

class CommentsController < ApplicationController def create @comment = current_user.comments.new(comment_params) if @comment.save flash[:success] = "成功" redirect_back(fallback_location: root_path) else flash[:danger] = "失敗" redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end

_comment_form.html.erb

<div> <%= form_with(model: [@book, @comment], local: true) do |f| %> <p><%= hidden_field_tag :user_id, current_user.id %></p> <%= f.text_area :content, placeholder: "コメント(30文字以内)", class: "comment_form" %> <%= f.submit "返信", class: "btn btn-primary" %> <% end %> </div>

追記

<div> <%= form_with(model: [@book, @comment], local: true) do |f| %> #エラーメッセージを表示 <%= render 'shared/error_messages', object: f.object %> <%= f.text_area :content, placeholder: "コメント(30文字以内)", class: "comment_form" %> <%= f.submit "返信", class: "btn" %> <% end %> </div>_comment_form.html.erb

shared/_error_messages.html.erb

<% if object.errors.any? %> <div id="error_explanation"> <div class="alert alert-danger"> エラー<%= object.errors.count %>件: <ul> <% object.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> </div> <% end %>

としたのですが、@comment.saveをした後にエラーメッセージが何も表示されません。。

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

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

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

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

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

Cojiro

2020/09/07 12:48

@comment.save をした後の、@comment.erros.full_messagesを記載していただけますか。
Asahi_sun_

2020/09/07 14:15

エラーメッセージの表示のさせ方が間違っていなければ、何もエラーが表示されません。。
Cojiro

2020/09/08 09:53

こんな感じで書けば、ログに表示されるはずです。(もしくはデバッグでも構いません。) 試してみてください。 # CommentsController else   puts @comment.erros.full_messages flash[:danger] = "失敗" redirect_back(fallback_location: root_path) end
guest

回答2

0

ベストアンサー

Commentが
belongs_to :user belongs_to :book
なのにcomment_params が
params.require(:comment).permit(:content)
だからです。 user_id、book_id が必要です
paramsに 両方ありますから、例えば
@comment = current_user.comments.new( comment_params.merge(user_id: params[:user_id], book_id: params[:book_id] ))
としてください。

投稿2020/09/09 10:39

winterboum

総合スコア23376

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

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

Asahi_sun_

2020/09/09 13:03

ご指摘いただいた方法で解決しました! 勉強になりました。ありがとうございます。
guest

0

エラーメッセージに詳細が表示されていないため、原因を特定するのが難しいかもしれません。いくつかの可能性がありますが、一般的な問題をいくつか紹介します。

comment_paramsメソッドが正しく機能していない可能性があります。コメントを送信する際に、comment_paramsメソッドでcontent以外のパラメーターが必要な場合があります。この場合、それらのパラメーターを含める必要があります。コメントモデルにどのようなパラメーターが必要かを確認してください。

current_userメソッドが機能していない可能性があります。コメントの投稿者を特定するために、@commentにcurrent_userを割り当てています。これは、ユーザーがログインしていない場合に失敗する可能性があります。ログインしているかどうかを確認し、必要に応じてcurrent_userメソッドを修正してください。tunnel rush

投稿2023/04/26 09:55

emmaorabelle

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問