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

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

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

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

Ruby on Rails

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

解決済

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

LL12
LL12

総合スコア5

Ruby

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

Ruby on Rails

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

1回答

0グッド

0クリップ

9724閲覧

投稿2020/10/29 11:43

編集2020/10/29 14:30

前提・実現したいこと

他者や自分が投稿したコンテンツ(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>

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

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

総合スコア22579

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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」にしたら解決しました!

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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