Estou tentando criar um novo registro de livro pelo painel de administração ativo, mas ele não é criado ao clicar no botão "Criar". Quando clico em "Criar", há uma solicitação POST para /admin/books contendo os dados do formulário. Mas, em vez de retornar um 302 e redirecionar para a lista de livros, ele retorna um 200 e o que parece ser o formulário de atualização. Embora retorne um 200, quando vou ao console para verificar se o livro foi criado, ele não é criado. Adicionei manualmente uma ação "novo" e "criar" ao modelo e isso funciona. A ação de criação funciona bem para outros modelos e afeta apenas o meu modelo de livro.
Aqui está o código no meu arquivo admin/books.rb
ActiveAdmin.register Book do
permit_params :title, :page_count, :book_type, :year_released, :price, :genre_id, :language_id, :author_id
# Displays the drop down menus correctly as well as all other inputs in order of my choosing
form do |show|
show.inputs "Details" do
show.input :language_id, as: :select, collection: Language.all.collect { |language|
[ language.language_short, language.id ] }
show.input :author_id, as: :select, collection: Author.all.collect { |author| [ author.full_name, author.age,
author.gender_short, author.biography, author.id ] }
show.input :title
show.input :genre_id, as: :select, collection: Genre.all.collect { |genre| [ genre.genre, genre.id ] }
show.input :book_type
show.input :year_released
show.input :price
end
show.actions
end
end
Aqui está o meu modelo de livro
class Book < ApplicationRecord
# Validates that all columns are not empty
validates :title, :page_count, :book_type, :year_released, :price, presence: true
# Validates that the title is unique
validates :title, uniqueness: true
# Associations between its parent tables and child table
# has_and_belongs_to_many :genres
belongs_to :language
belongs_to :author
has_many :purchases
def self.ransackable_associations(auth_object = nil)
[ "author", "genres", "language", "purchases" ]
end
def self.ransackable_attributes(auth_object = nil)
[ "author_id", "book_type", "created_at", "genre_id", "id", "language_id", "page_count", "price", "title", "updated_at", "year_released" ]
end
end
Quando uso o formulário de livro padrão em vez do meu formulário personalizado, o atributo genre_id não aparece e continua com o mesmo comportamento (falha ao criar o livro e retorna POST 200).
Estou usando o Ruby versão 3.4.1 e o Rails versão 8.0.2.
E estes são os logs do servidor ao criar um novo livro
Started POST "/admin/books" for 127.0.0.1 at 2025-04-10 14:45:29 -0500
Processing by Admin::BooksController#create as HTML
Parameters: {"authenticity_token" => "[FILTERED]", "book" => {"language_id" => "3", "author_id" => "6", "title" => "Captain Underpants", "genre_id" => "8", "book_type" => "Physical", "year_released" => "1997", "price" => "9.99"}, "commit" => "Create Book"}
AdminUser Load (0.2ms) SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = 3 ORDER BY "admin_users"."id" ASC LIMIT 1 /*action='create',application='ECommerce',controller='books'*/
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*action='create',application='ECommerce',controller='books'*/
Book Exists? (2.9ms) SELECT 1 AS one FROM "books" WHERE "books"."title" = 'Captain Underpants' LIMIT 1 /*action='create',application='ECommerce',controller='books'*/
Language Load (0.3ms) SELECT "languages".* FROM "languages" WHERE "languages"."id" = 3 LIMIT 1 /*action='create',application='ECommerce',controller='books'*/
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = 6 LIMIT 1 /*action='create',application='ECommerce',controller='books'*/
TRANSACTION (0.1ms) ROLLBACK TRANSACTION /*action='create',application='ECommerce',controller='books'*/
Rendering /home/segern/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/activeadmin-3.3.0/app/views/active_admin/resource/new.html.arb
Language Load (0.2ms) SELECT "languages".* FROM "languages" /*action='create',application='ECommerce',controller='books'*/
↳ app/admin/books.rb:7:in 'Enumerable#collect'
Author Load (0.7ms) SELECT "authors".* FROM "authors" /*action='create',application='ECommerce',controller='books'*/
↳ app/admin/books.rb:9:in 'Enumerable#collect'
Genre Load (0.3ms) SELECT "genres".* FROM "genres" /*action='create',application='ECommerce',controller='books'*/
↳ app/admin/books.rb:12:in 'Enumerable#collect'
Rendered /home/segern/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/activeadmin-3.3.0/app/views/active_admin/resource/new.html.arb (Duration: 57.9ms | GC: 1.0ms)
Completed 200 OK in 89ms (Views: 58.0ms | ActiveRecord: 4.5ms (7 queries, 0 cached) | GC: 1.7ms)
Started GET "/favicon.ico" for 127.0.0.1 at 2025-04-10 14:45:29 -0500
ActionController::RoutingError (No route matches [GET] "/favicon.ico"):
Você precisa de um
page_count
, mas não há entrada de formulário para ele. Sem ele,page_count
sempre haverá um erro de validação.Este erro deve aparecer nos seus logs .Você pode fazer com que os erros de validação apareçam nos seus logs , mas é melhor exibir os erros de validação no seu formulário, para o benefício do usuário. Adicione esta linha.Veja ActiveAdmin: Exibindo erros e Formtastic: Erros semânticos .