Rails Active Admin Create action fails to create my Book model but works for other models

Rails Active Admin Create action fails to create my Book model but works for other models
typescript
Ethan Jackson

I'm trying to create a new book record through the active admin dashboard, but it doesn't create when pressing the create button. When I hit create there is a POST request to /admin/books and contains the forms data. But instead of returning a 302 and redirecting to the books list it returns a 200 and what looks like the update form. Even though it returns a 200 when I go to the console to check if the book was created it is not created. I manually added a new and create action to the model and that does work. The creation action works fine for other models and only affects my Book model.

Here's the code in my admin/books.rb file

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

Here is my Book model

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

When I use the default Book form rather than my custom form the genre_id attribute does not appear, and still does the same behaviour (Fails to create the book and returns POST 200).

I'm using Ruby version 3.4.1 and Rails version 8.0.2.

And these are the server logs when creating a new Book

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"):

Answer

You require a page_count but there is no form input for it. With no page_count there will always be a validation error.

validates :title, :page_count, :book_type, :year_released, :price, presence: true ^^^^^^^^^^^

This error should show up in your logs. You can make validation errors show up in your logs, but it's better to display validation errors in your form, for the user's benefit. Add this line.

show.semantic_errors *show.object.errors.attribute_names

See ActiveAdmin: Displaying Errors and Formtastic: Semantic Errors.

Related Articles