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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

3533閲覧

Ruby on Railsで投稿に対するコメントを表示する方法

kur

総合スコア3

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/12/18 02:51

前提・実現したいこと

プログラミング初学者です。
現在、rails→5.2.4のバージョンで本の投稿ができるアプリを作っています。
投稿された本に対してコメントができる機能を実装したいのですが、コメントの一覧表示がうまくできないことと、そのコメント数をカウントするための表示ができないため、ご教授いただきたいです。

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

添付画像のようにコメントを送信するためのフォームとコメントをカウントする表示は画面上に表示されているのですが、送信ボタンを押してもコメントの一覧もコメント数にも反映されず、何も表示されない状態です。
フォームにコメントを書き、送信ボタンを押すとこの画面上にそのコメントが表示され、コメント数:0のところもカウントされていきたいです。

イメージ説明

また、コメント数はもう一つ別の画面にもカウントされ、表示できるようにしたいです。
イメージ説明

該当のソースコード

class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :books, dependent: :destroy has_many :book_comments, dependent: :destroy attachment :profile_image validates :name, uniqueness: true validates :name, length: { in: 2..20 } validates :introduction, length: { maximum: 50 } end
class Book < ApplicationRecord belongs_to :user has_many :book_comments, dependent: :destroy validates :title, presence: true validates :body, presence: true validates :body, length: { maximum: 200 } end
class BookComment < ApplicationRecord belongs_to :user belongs_to :book end
Rails.application.routes.draw do devise_for :users root to: 'homes#top' get "home/about" => "homes#about", as: "about" resources :homes resources :books do resources :book_comments, only: [:create, :destroy] end resources :users end
class UsersController < ApplicationController before_action :authenticate_user! before_action :ensure_correct_user, only: [:edit, :update] def show @user = User.find(params[:id]) @book = Book.new end def new @book = Book.new end def create @book = Book.new(book_params) @book.user_id = current_user.id if @book.save redirect_to book_path(@book) else render :index end end def index @book = Book.new @users = User.all end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) @user = current_user if @user.update(user_params) flash[:notice] = "You have updated user successfully." redirect_to user_path(@user) else render :edit end end private def user_params params.require(:user).permit(:name, :introduction, :profile_image_id) end def ensure_correct_user @user = User.find(params[:id]) unless @user == current_user redirect_to user_path(current_user.id) end end end
class BooksController < ApplicationController before_action :authenticate_user! before_action :ensure_correct_user, only: [:edit, :update] def new @book = Book.new end def create @book = Book.new(book_params) @book.user_id = current_user.id if @book.save flash[:notice] = "You have created book successfully." redirect_to book_path(@book) else @user = current_user @books = Book.all render :index end end def index @books = Book.all @user = current_user @book = Book.new end def show @book = Book.find(params[:id]) @book_new = Book.new @book_comment = BookComment.new # @book_comments = @book.book_comments end def edit @book = Book.find(params[:id]) end def update @book = Book.find(params[:id]) @book.user_id = current_user.id if @book.update(book_params) flash[:notice] = "You have updated book successfully." redirect_to book_path(@book) else render :edit end end def destroy @book = Book.find(params[:id]) @book.destroy redirect_to books_path end private def book_params params.require(:book).permit(:title, :body) end def ensure_correct_user @book = Book.find(params[:id]) unless @book.user == current_user redirect_to books_path end end end
class BookCommentsController < ApplicationController def create book = Book.find(params[:book_id]) comment = BookComment.new(book_comment_params) comment.user_id = current_user.id comment.book_id = book_comment_params comment.save redirect_to book_path(book) end def destroy BookComment.find_by(id: params[:id], book_id: params[:book_id]).destroy redirect_to book_path(params[:book_id]) end private def book_comment_params params.require(:book_comment).permit(:comment) end end

views/books/show.html.erb

<div class="container"> <div class="row"> <div class="col-md-3"> <%= render 'users/user_show', user: @book.user %> <%= render 'books/book_new', book: @book_new %> </div> <div class="col-md-8 offset-md-1 pt-md-3"> <h2>Book detail</h2> <table class="table"> <tbody> <tr> <td> <%= link_to user_path(@book.user) do %> <%= attachment_image_tag @book.user, :profile_image ,size: "40x40", farmat: 'jpg', fallback: "no_image.jpg" %><br> <%= @book.user.name %> <% end %> </td> <td><%= link_to @book.title, book_path(@book) %></td> <td><%= @book.body %></td> <td><% if @book.user == current_user %> <%= link_to "Edit", edit_book_path(@book), class: "btn-success btn btn-sm" %> <% end %> </td> <td><% if @book.user == current_user %> <%= link_to "Destroy", book_path(@book), method: :delete, data: { confirm: "本当に消しますか?"}, class: "btn-danger btn btn-sm "%> <% end %> </td> <td>コメント数:<%= @book.book_comments.count %></td> </tr> </tbody> </table> <div class="comments"> <% @book.book_comments.each do |book_comment| %> <p><%= image_tag('sample-author1.jpg') %></p> <%= book_comment.user.name %> <%= book_comment.comment %> <% if book_comment.user == current_user %> <%= link_to "Destroy", book_book_comment_path(book_comment.book, book_comment), method: :delete, class: "btn-danger btn btn-sm "%> <% end %> <% end %> </div> <div class="new-comment"> <%= form_with(model:[@book, @book_comment], local: true) do |f| %> <%= f.text_area :comment, class: 'form-control' %> <%= f.submit "送信する" %> <% end %> </div> </div> </div> </div>

views/books/_book_index.html.erb

<h2>Books</h2> <table class="table table-hover"> <thead> <th></th> <th>Title</th> <th>Opinion</th> </thead> <tbody> <% books.each do |book| %> <tr> <td><%= link_to user_path(book.user.id) do %> <%= attachment_image_tag book.user, :profile_image, size: "60x60", farmat: 'jpg', fallback: "no_image.jpg" %></td> <% end %> <td><%= link_to book_path(book.id) do %> <%= book.title %> <% end %> </td> <td><%= book.body %></td> <td><%= "#{book.book_comments.count} コメント" %></td> </tr> <% end %> </tbody> </table>

試したこと

アソシエーションも間違いないことを確認し、bookとbook_commentがネストで書かれていることも確認しました。
検索したことを頼りにbook controllerに@book_commentsとインスタンス変数を書き、それをview側に渡したりもしたのですが、結果は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

自己解決

book_comments controllerを

def create @book = Book.find(params[:book_id]) comment = BookComment.new(book_comment_params) comment.user_id = current_user.id comment.book_id = @book.id if comment.save redirect_to book_path(@book)

変更し、また、books/show.html.erbの記述も<div>ではなく<table>に投稿されたコメントのコードを書きました。

投稿2020/12/18 04:33

kur

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問