前提・実現したいこと
プログラミング初学者です。
現在、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/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。