前提・実現したいこと
詳細画面を表示したいです。
現在、1対多の関係でBookとuserが結びついているwebアプリケーションを制作しようとしています。
また、詳細画面にはUser情報と新規投稿画面を画面の左側に表示したいと考えています。
どなたか分かる方よろしくお願い致します。
詳細画面に表示されるエラーメッセージ
エラーメッセージ
ActiveRecord::RecordNotFound in BooksController#show
Couldn't find Book with 'id'=1
Bookモデルの中身
以下はコンソール上で、Book.allを実行したときの様子です。
ソースコード
$ Book.all =><#Book id: 16, created_at: "2021-04-28 12:57:10", updated_at: "2021-04-28 12:57:10", title: "ppppp", body: "jjjjjj", user_id: 1>
###以下のコードは今回のエラーに関係ありそうなコードです
routes.rb
Rails.application.routes.draw do devise_for :users root to: 'homes#top' get "home/about" => "homes#about" resources :books resources :users, only: [:show, :create, :index, :edit, :update] end
show.html.erb
<div class='container px-5 px-sm-0'> <div class='row'> <div class='col-md-3'> <!--user.infoの部分テンプレート--> <%= render 'users/user', user: @user %> <!-- 投稿画面の部分テンプレート--> <%= render 'books/book', book: @book_new %> </div> <!--投稿の詳細部分--> <div class="col-md-8 offset-md-1"> <h2>Book detail</h2> <table class="table"> <tbody> <tr> <td> <%= link_to user_path(@book.user_id) do %> <%= attachment_image_tag @book.user , :profile_image, :fill, 50, 50,fallback: "no_image.jpg" %></br> <%= @book.user.name %> <% end %> </td> <td> <%= link_to @book.title ,edit_book_path(current_user) %> </td> <td> <%= @book.body %> </td> <% if @book.user_id == current_user.id %> <td><%= link_to "Edit",edit_book_path(@book.id), class: "btn btn-sm btn-success" %></td> <td><%= link_to "Destroy", book_path(@book.id),method: :delete ,class: "btn btn-sm btn-danger" , "data-confirm" => "本当に削除しますか?"%></td> <% end %> </tr> </tbody> </table> </div> </div> </div>
books_controllor
class BooksController < ApplicationController before_action :authenticate_user! def index @user = current_user @book = Book.new @books = Book.all end def create @user = current_user @book = Book.new(book_params) @book.user_id = current_user.id @book.save render action: :show end def show @user = current_user @book = Book.find(params[:id]) @newbook = Book.new end def edit @book = Book.find(params[:id]) end def update @book = Book.find(params[:id]) @book.update(book_params) @book.user_id = current_user.id redirect_to books_path 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 end
user情報の部分テンプレート
_user.html.erb
<h2>User info</h2> <tr> <%= attachment_image_tag user, :profile_image,:fill,60,60,fallback:"no_image.jpg"%> </tr> <table class='table'> <tbody> <tr> <th>name</th> <th><%= user.name %></th> </tr> <tr> <th>introduction</th> <th><%= user.introduction %></th> </tr> </tbody> </table> <div class='row'> <%= link_to "",edit_user_path(current_user),class:"fas fa-user-cog btn btn-outline-secondary btn-block" %> </div>
新規投稿の部分テンプレート
_book.html.erb
<h2 class="mt-3">New book</h2> <%= form_with model:book,local:true do |f| %> <div class="form-group"> <%= f.label :title %> <%= f.text_field :title, class: "form-control book_title" %> </div> <div class="form-group"> <%= f.label :body,"Opinion" %> <%= f.text_area :body,class: "form-control book_body" %> </div> <div class="form-group"> <%=f.submit "Create Book",class: "btn btn-success" %> </div> <% end %>
bookのdb>migrateファイルです
class CreateBooks < ActiveRecord::Migration[5.2] def change create_table :books do |t| t.timestamps end end end
bookのdb>migrateファイルです
class AddColumnToBooks < ActiveRecord::Migration[5.2] def change add_column :books, :title, :string add_column :books, :body, :text add_column :books, :user_id, :integer end end
試したこと
同じエラーの記事を参考にroutes.rbを確認したがresourcesを使っているため特に問題なさそうです。
開発環境とフレームワーク
cloud9
Ruby on Rails
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/30 03:07