Techioz Blog

空の結果を表示する Book.all アクション

概要

私は Ruby On Rails 開発の初心者で、クラス user、book、author、shelf を含む API を構築しています。 Book.all を呼び出してデータベース内のすべての書籍を取得すると、[] が返されますが、何が問題なのかわかりません。ブック移行、ブックモデル、およびブックコントローラーファイルは次のとおりです。

class CreateBooks < ActiveRecord::Migration[7.0]
  def change
    create_table :books do |t|
      t.string :title
      t.references :user, null: false, foreign_key: true

      t.timestamps
    end
  end
end
class Book < ApplicationRecord
  belongs_to :user
  belongs_to :author
  belongs_to :shelf
end
class Api::BooksController < ApplicationController
  def index
    books = Book.all
    render json: book
  end
  
  def show
    book = Book.find(params[:id])
    render json: book
  end
  
  def create
    book = Book.new(book_params)
  
    if book.save
      render json: book, status: :created
    else
      render json: { errors: book.errors.full_messages }, status: :unprocessable_entity
    end
  end
  
  def destroy
    book = Book.find(params[:id])
    if book.destroy
      render json: { message: 'Book was deleted successfully' }
    else
      render json: { error: 'Failed to delete the Book' }, status: :unprocessable_entity
    end
  end
  
  private
  
  def book_params
    params.require(:book).permit(:title)
  end
end

私が作成した本の名前がデータベースに表示されることを期待していました。 Railsコンソールでの実行方法は次のとおりです。

book = Book.new(title: "Pearl of Great Price")  

解決策

対処する必要があるエラーがいくつかあります。

def index
  books = Book.all
  render json: books
end
Book.create(title: "Pearl of Great Price")  

# You can also do: new + save
book = Book.new(...)
book.save

belongs_to :user と DB 制約があるため、おそらくユーザーも渡す必要があるため、次のようにする必要があります。

Book.create(title: "...", user: User.last)  

最後に、モデル内でさらに多くのリレーションを定義したら、「有効な」ブックを作成するためにリレーションを送信する必要があります。

Book.create(title: "...", user: User.last, author: Author.last, shelf: Shelf.last)

もちろん、最初にそれらのレコードを作成する必要があります。これらの関係をすべて必須にしたくない場合は、belongs_to 関連付けにオプションの true 設定を追加することもできます。詳細: https://guides.rubyonrails.org/association_basics.html