🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 6

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

Q&A

解決済

2回答

689閲覧

Ruby - コメントがDBに保存されない

lwbox

総合スコア1

Ruby on Rails 6

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

0グッド

1クリップ

投稿2021/03/08 12:53

編集2021/03/09 03:37

前提・実現したいこと

rails でブログを投稿できるwebアプリケーションを作っていてコメント機能を実装しています。
コメントを投稿したいのですが、保存されず投稿ボタンを押してもそのままになっています。

試してみたこと

まず commentのコントローラにて binding.pry を使って paramsに値が入っているか確認しました。

2: def create => 3: binding.pry 4: @post = Post.find(params[:post_id]) 5: @comment = Comment.new(comment_params) 6: if @comment.save 7: redirect_to post_path(@comment.post) 8: else 9: @comments = @post.comments 10: render "posts/show" 11: end 12: end [1] pry(#<CommentsController>)> params => <ActionController::Parameters {"authenticity_token"=>"CGJ6VwkXu2JAnQgGwOFKrnfWCdjIJlj4gsqqq6tVHP91rU4t5HA0zq5WZspb7d0czDYuO1qhPR6/K+MBrpEtcw==", "comment"=>{"text"=>"good"}, "commit"=>"Send", "controller"=>"comments", "action"=>"create", "post_id"=>"4"} permitted: false> [2] pry(#<CommentsController>)> params[:text] => nil [3] pry(#<CommentsController>)> params[:comment][:text] => "good"

みるとgoodと入力した値はしっかり入っています。
ですがなぜpermitted:falseになっているのでしょう。

該当のソースコード

コメントのコントローラです。
app/controllers/comments_controller.rb

class CommentsController < ApplicationController def create @post = Post.find(params[:post_id]) @comment = Comment.new(comment_params) if @comment.save redirect_to post_path(@comment.post) else @comments = @post.comments render "posts/show" end end private def comment_params params.require(:comment).permit(:text).merge(user_id: current_user.id, post_id: params[:post_id]) end end

postのコントローラです。
app/controllers/posts_controller.rb

class PostsController < ApplicationController before_action :authenticate_user!, except: :index before_action :set_post, only: [:show, :edit, :update, :destroy] def index @posts = Post.all @tags = Post.tag_counts_on(:tags).most_used(20) if @tag = params[:tag] @post = Post.tagged_with(params[:tag]) end end def new @post = Post.new end def create @post = Post.new(post_params) if @post.valid? @post.save redirect_to root_path else render :new end end def show @tags = @post.tag_counts_on(:tags) @comment = Comment.new @comments = @post.comments.includes(:user) end def edit unless @post.user.id == current_user.id redirect_to root_path end end def update if @post.update(post_params) redirect_to root_path else render :edit end end def destroy if @post.destroy redirect_to root_path end end private def set_post @post = Post.find(params[:id]) end def post_params params.require(:post).permit(:concept, :title, :image, :tag_list).merge(user_id: current_user.id) end end

一応ビューファイルも載せておきます。
app/views/posts/show.html.erb

<div class="card mb-3"> <div class="card-header"> <%= link_to @post.user.name, user_path(@post.user.id, method: :get) %> </div> <%=link_to image_tag(@post.image, class: "card-img-top"), post_path(@post.id) %> <div class="card-body"> <h5 class="card-title"><%= @post.title%></h5> <p class="card-text"><%= @post.concept%></p> <% if @post.tag_list.any? %> <% @post.tags.each do |tag| %> <%= link_to posts_path(tag: tag.name) do %> <div class="badge badge badge-info"><%= "#{tag.name}(#{tag.taggings_count})" %></div> <% end %> <% end %> <% end %> <% if user_signed_in? && current_user.id == @post.user_id %> <%= link_to 'Edit', edit_post_path(@post.id), class: 'btn btn-primary mr-3' %> <%= link_to 'Delete', post_path(@post), method: :delete, remote: true, data: {confirm: "You sure want to delete #{@post.title}?"}, class: 'btn btn-danger delete'%> <% end %> <div class="post__comments"> <% if user_signed_in? %> <%= form_with model: [@post, @comment], local: true do |f|%> <div class="comment-box"> <%= f.label :text, "Comment" %><br /> <%= f.text_field :text %> </div> <div class="actions"> <%= f.submit "Send", class: "btn btn-primary" %> </div> <% end %> <% end %> <ul class="comments_lists"> <% @comments.each do |comment| %> <li class="comments_list" > <%= comment.text %> <%= link_to comment.user.name, "/users/#{comment.user.id}", class: :comment_user %> </li> <% end %> </ul> </div> </div> </div>

解決方法が分かる方などがいらっしゃいましたらアドバイスの方よろしくお願いします。

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

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

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

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

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

guest

回答2

0

それを解決するには、CommentsControllerのcomment_paramsメソッドにストロングパラメータを設定する必要があります。comment_paramsメソッドでは、params.require(:comment).permit(:text)のように、commentをキーにしてtext属性を許可するように記述する必要があります。foodle

投稿2023/07/29 08:46

lilysnape

総合スコア4

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

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

0

ベストアンサー

「なぜpermitted:falseになっているのでしょう」
それはまだ permitしていないからです。

save出来ない原因を確認するには、一時的に if @comment.save! と ! 付きにしてみてください。

標準な方法は else の方でエラーを表示させるのですが。

投稿2021/03/09 23:20

winterboum

総合スコア23567

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

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

lwbox

2021/03/10 00:23

ありがとうございます。おかげで原因が確認できました。 モデルのアソシエーションの記述が違っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問