空の結果を表示する 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