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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

3回答

13485閲覧

Unpermitted parameter: :commentを解決したい。

LL12

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/29 11:43

編集2023/10/15 20:39

前提・実現したいこと

他者や自分が投稿したコンテンツ(protptype)の詳細ページでコメントする機能を実装中。

①コメント欄に入力があり、「送信する」をクリックすれば、コメントが投稿された詳細ページに遷移、
②コメント欄がブランクであれば、新規コメントがない状態の詳細ページに戻る(留まる)ようにしたい。

②はうまくいくが、①が上手く機能しない。(詳細は次の項目)

恐れ入りますがご助言いただけますと幸いです。

発生している問題・エラーメッセージ

コメント欄に文字を入力しても、投稿したコメントが反映されず、DBにも保存されない。
ブラウザ上ではエラーにはならず、投稿したコンテンツ(protptype)一覧の画面に戻る。
つまり、コメント欄がブランクの場合と同様の挙動が起こる。

DBにコメントが保存されない状況をターミナルで確認すると、

Unpermitted parameter: :comment

が出ている。
この解決方法がわからず、ご教示願いたい。

該当のソースコード

▼commentsコントローラー

ruby

1class CommentsController < ApplicationController 2 3 def create 4 @comment = Comment.new(comment_params) 5 if @comment.save 6 redirect_to "/prototypes/#{@comment.prototype.id}" 7 else 8 @prototype = @comment.prototype 9 @comments = @prototype.comments 10 render "prototypes/show" 11 end 12 end 13 14 private 15 def comment_params 16 params.require(:comment).permit(:text).merge(user_id: current_user.id, prototype_id: params[:prototype_id]) 17 end 18end

▼prototypeコントローラー

ruby

1class PrototypesController < ApplicationController 2 before_action :authenticate_user! 3 4 def index 5 @prototypes = Prototype.all 6 end 7 8 def new 9 @prototype = Prototype.new 10 end 11 12 def create 13 @prototype = Prototype.new(prototype_params) 14 if @prototype.save 15 redirect_to root_path 16 else 17 render :new 18 end 19 end 20 21 def show 22 @prototype = Prototype.find(params[:id]) 23 @comment = Comment.new 24 @comments = @prototype.comments.includes(:user) 25 end 26 27 def edit 28 @prototype = Prototype.find(params[:id]) 29 unless @prototype.user_id == current_user.id 30 redirect_to action: :index 31 end 32 end 33 34 def update 35 @prototype = Prototype.find(params[:id]) 36 if @prototype.update(prototype_params) 37 redirect_to prototype_path 38 else 39 render :edit 40 end 41 end 42 43 def destroy 44 prototype = Prototype.find(params[:id]) 45 if prototype.destroy 46 redirect_to root_path 47 end 48 end 49 50 private 51 def prototype_params 52 params.require(:prototype).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id) 53 end 54end

▼show.html.erb

html

1<main class="main"> 2 <div class="inner"> 3 <div class="prototype__wrapper"> 4 <p class="prototype__hedding"> 5 <%= @prototype.title%> 6 </p> 7 <%= link_to "by #{@prototype.user.name}", root_path, class: :prototype__user %> 8 <% if user_signed_in? && current_user.id == @prototype.user_id %> 9 <div class="prototype__manage"> 10 <%= link_to "編集する", edit_prototype_path, method: :get, class: :prototype__btn %> 11 <%= link_to "削除する", prototype_path, method: :delete, class: :prototype__btn %> 12 </div> 13 <% end %> 14 <div class="prototype__image"> 15 <%= image_tag @prototype.image %> 16 </div> 17 <div class="prototype__body"> 18 <div class="prototype__detail"> 19 <p class="detail__title">キャッチコピー</p> 20 <p class="detail__message"> 21 <%= @prototype.catch_copy %> 22 </p> 23 </div> 24 <div class="prototype__detail"> 25 <p class="detail__title">コンセプト</p> 26 <p class="detail__message"> 27 <%= @prototype.concept %> 28 </p> 29 </div> 30 </div> 31 <div class="prototype__comments"> 32 <% if user_signed_in? %> 33 <%= form_with model: [@prototype, @comment], local: true do |f| %> 34 <div class="field"> 35 <%= f.label :comment, "コメント" %><br /> 36 <%= f.text_field :comment %> 37 </div> 38 <div class="actions"> 39 <%= f.submit "送信する", class: :form__btn %> 40 </div> 41 <% end %> 42 <% end %> 43 <ul class="comments_lists"> 44 <% if @comments %> 45 <% @comments.each do |comment| %> 46 <li class="comments_list"> 47 <%= @comment %> 48 <%= link_to comment.text + "(#{@prototype.user.name})", "/users/#{current_user.id}", class: :comment_user %> 49 <% end %> 50 <% end %> 51 </li> 52 </ul> 53 </div> 54 </div> 55 </div> 56</main>

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

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

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

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

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

guest

回答3

0

この問題の解決策は、コントローラーのコメントを有効にすることです。 コントローラーでは、コメントパラメータが soccer random

投稿2023/07/18 07:37

sortturtledove

総合スコア3

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

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

0

「Unpermitted parameter: :comment」というエラーは、RailsでStrong Parametersを使用している場合によく発生します。これは、コントローラーで許可されていないパラメーターが渡された場合に表示されます。

このエラーを解決するためには、コントローラーでコメントを許可する必要があります。例えば、コメントのパラメーターが「body」である場合、以下のようにコントローラーに記述することができます。bluey

投稿2023/04/26 09:53

emmaorabelle

総合スコア6

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

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

0

ベストアンサー

多分 saveで失敗しています。
エラーメッセージが表示されないのは、表示するようにviewに書かれていないからです。
一時的にif @comment.save!と ! 付きで試してどんなエラーなのか確かめましょう

追記
params.require(:comment).permit(:text) だからです。
Commentモデルのコメントを入れるcolumn名は comment ですか?textですか?
viewでは commentだといい、ここではtextだと言ってます。
commentが正しいなら
params.require(:comment).permit(:comment) にしてください

投稿2020/10/29 13:10

編集2020/10/29 23:01
winterboum

総合スコア23284

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

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

LL12

2020/10/29 13:35

winterboumさん、早速ご回答いただきありがとうございます。 エラー文やに解決したい部分について、わかりづらい表記をしておりました。 コメント欄がブランクで送信しようとした場合、はエラー分の表示などはなく、そのままコメント作成画面に留まるような使用にしたいと考えています。 (エラーメッセージ、というのはrubyのエラーメッセージなどは確認されない、という意味でした。) 解決したい部分は、入力したコメントが保存されない、という部分です。 それに伴い、現在記述している「コメント保存の成功時・失敗時」の条件分岐などが正しいかどうか確認したい、といった意図です。 早々にご回答いただけましたこと、改めて感謝申し上げます。
winterboum

2020/10/29 22:57 編集

いえ、それは理解しています。 その保存されない原因を知るために save! でやって、 という助言です ああ、Unpermitted parameter: :commentは分かってたんでしたね。 「エラーが表示されない」 に反応してしまった
LL12

2020/11/05 05:53

winterboumさん ありがとうございました、おっしゃる通り、viewファイルを「text」にしたら解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問