前提・実現したいこと
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>
解決方法が分かる方などがいらっしゃいましたらアドバイスの方よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。