How do I upload images to Cloudinary through ForestAdmin

Expected behavior

Inside ForestAdmin (production environment) I want to be upload images just like I can when I go inside my rails app and do it through a new/edit form.

Actual behavior

When go inside my houses table to house > photos blob I find the 3 photos I’ve uploaded per house. If I wanted to add a new photo this happens:

I don’t really know how to set this up. Could use some help.

Hello @OKMantis !
It looks like an error coming from your liana, do you have any logs there ?

I’ve tried it again and now I get this message:

Point is that it’s asking me to fill in fields like “byte_size” which I normally wouldn’t have to fill in if it were an upload done through the rails app. I think this kind of data is filled in by the Cloudinary Uploader API (with help of the Cloudinary gem in the rails app).

And the logs say this:

 TRANSACTION (0.1ms)  BEGIN
  ActiveStorage::Blob Create (22.8ms)  INSERT INTO "active_storage_blobs" ("key", "service_name", "created_at") VALUES ($1, $2, $3) RETURNING "id"  [["key", "data: TOO LONG TO FIT IN THIS POST]]
  TRANSACTION (0.2ms)  ROLLBACK
Completed 400 Bad Request in 53ms (Views: 0.2ms | ActiveRecord: 23.1ms | Allocations: 6390)

Hi @OKMantis,

Does the upload succeed? (Can you see your photos on Cloudinary?)
Can you please share relevant table structures and forest models?

Regards

The files I’ve tried to upload haven’t showed up inside Cloudinary.

Here’s the schema.rb of my rails app:

# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2021_02_18_190152) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "active_storage_attachments", force: :cascade do |t|
    t.string "name", null: false
    t.string "record_type", null: false
    t.bigint "record_id", null: false
    t.bigint "blob_id", null: false
    t.datetime "created_at", null: false
    t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
    t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
  end

  create_table "active_storage_blobs", force: :cascade do |t|
    t.string "key", null: false
    t.string "filename", null: false
    t.string "content_type"
    t.text "metadata"
    t.string "service_name", null: false
    t.bigint "byte_size", null: false
    t.string "checksum", null: false
    t.datetime "created_at", null: false
    t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
  end

  create_table "active_storage_variant_records", force: :cascade do |t|
    t.bigint "blob_id", null: false
    t.string "variation_digest", null: false
    t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
  end

  create_table "categories", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "category_translations", force: :cascade do |t|
    t.bigint "category_id", null: false
    t.string "locale", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "name"
    t.index ["category_id"], name: "index_category_translations_on_category_id"
    t.index ["locale"], name: "index_category_translations_on_locale"
  end

  create_table "contacts", force: :cascade do |t|
    t.string "name"
    t.string "phone"
    t.string "email"
    t.text "comment"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "country_code"
  end

  create_table "friendly_id_slugs", force: :cascade do |t|
    t.string "slug", null: false
    t.integer "sluggable_id", null: false
    t.string "sluggable_type", limit: 50
    t.string "scope"
    t.datetime "created_at"
    t.index ["slug", "sluggable_type", "scope"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type_and_scope", unique: true
    t.index ["slug", "sluggable_type"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type"
    t.index ["sluggable_type", "sluggable_id"], name: "index_friendly_id_slugs_on_sluggable_type_and_sluggable_id"
  end

  create_table "houses", force: :cascade do |t|
    t.string "sku"
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "user_id"
    t.integer "width"
    t.integer "length"
    t.bigint "category_id"
    t.string "slug"
    t.integer "original_price_cents", default: 0, null: false
    t.boolean "price_present", default: true, null: false
    t.integer "wall", default: 28, null: false
    t.boolean "special_offer", default: false, null: false
    t.integer "discount", default: 15
    t.index ["category_id"], name: "index_houses_on_category_id"
    t.index ["slug"], name: "index_houses_on_slug", unique: true
    t.index ["user_id"], name: "index_houses_on_user_id"
  end

  create_table "inquiries", force: :cascade do |t|
    t.string "name"
    t.string "phone"
    t.string "email"
    t.string "region"
    t.text "comment"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "house_id"
    t.string "country_code"
    t.index ["house_id"], name: "index_inquiries_on_house_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet "current_sign_in_ip"
    t.inet "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "admin"
    t.string "first_name"
    t.string "last_name"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

  add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
  add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
  add_foreign_key "houses", "categories"
  add_foreign_key "houses", "users"
  add_foreign_key "inquiries", "houses"
end

And this from .forestadmin-schema.json (part 1):

{
  "collections": [{
    "name": "ActiveStorage__Attachment",
    "name_old": "active_storage_attachments",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "record_type",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "record_id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "blob",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "ActiveStorage__Blob.id",
      "inverse_of": "attachments",
      "relationship": "BelongsTo",
      "widget": null,
      "validations": []
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": []
  }, {
    "name": "ActiveStorage__Blob",
    "name_old": "active_storage_blobs",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "key",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "filename",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "content_type",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "metadata",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "service_name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "byte_size",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "checksum",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "variant_records",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "ActiveStorage__VariantRecord.id",
      "inverse_of": "blob",
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }, {
      "field": "preview_image_attachment",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "ActiveStorage__Attachment.id",
      "inverse_of": "record",
      "relationship": "HasOne",
      "widget": null,
      "validations": []
    }, {
      "field": "preview_image_blob",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "ActiveStorage__Blob.id",
      "inverse_of": null,
      "relationship": "HasOne",
      "widget": null,
      "validations": []
    }, {
      "field": "attachments",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "ActiveStorage__Attachment.id",
      "inverse_of": "blob",
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": []
  }, {
    "name": "Category",
    "name_old": "categories",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "updated_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "houses",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "House.id",
      "inverse_of": "category",
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }, {
      "field": "translations",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "Category__Translation.id",
      "inverse_of": "globalized_model",
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": []
  }, {
    "name": "Category__Translation",
    "name_old": "category_translations",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "globalized_model",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "Category.id",
      "inverse_of": "translations",
      "relationship": "BelongsTo",
      "widget": null,
      "validations": []
    }, {
      "field": "locale",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "updated_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": []
  }, {
    "name": "Contact",
    "name_old": "contacts",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "phone",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "email",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is like",
        "value": "/^[a-zA-Z0-9.!\\#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/"
      }, {
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "comment",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is longer than",
        "value": 20
      }, {
        "message": null,
        "type": "is shorter than",
        "value": 1000
      }]
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "updated_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "country_code",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": []
  }, {
    "name": "House",
    "name_old": "houses",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "sku",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "updated_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "user",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "User.id",
      "inverse_of": "houses",
      "relationship": "BelongsTo",
      "widget": null,
      "validations": []
    }, {
      "field": "width",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "length",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "category",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "Category.id",
      "inverse_of": "houses",
      "relationship": "BelongsTo",
      "widget": null,
      "validations": []
    }, {
      "field": "slug",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "original_price_cents",
      "type": "Number",
      "default_value": "0",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "price_present",
      "type": "Boolean",
      "default_value": "true",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "wall",
      "type": "Number",
      "default_value": "28",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "special_offer",
      "type": "Boolean",
      "default_value": "false",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "discount",
      "type": "Number",
      "default_value": "15",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "inquiries",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "Inquiry.id",
      "inverse_of": "house",
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }, {
      "field": "photos_attachments",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "ActiveStorage__Attachment.id",
      "inverse_of": "record",
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }, {
      "field": "photos_blobs",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "ActiveStorage__Blob.id",
      "inverse_of": null,
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": []
  }, {
    "name": "Inquiry",
    "name_old": "inquiries",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "phone",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "email",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is like",
        "value": "/^[a-zA-Z0-9.!\\#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/"
      }, {
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "region",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": true,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": [{
        "message": null,
        "type": "is present"
      }]
    }, {
      "field": "comment",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "updated_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "house",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "House.id",
      "inverse_of": "inquiries",
      "relationship": "BelongsTo",
      "widget": null,
      "validations": []
    }, {
      "field": "country_code",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": []
  }, {
    "name": "User",
    "name_old": "users",
    "icon": null,
    "is_read_only": false,
    "is_searchable": true,
    "is_virtual": false,
    "only_for_relationships": false,
    "pagination_type": "page",
    "fields": [{
      "field": "id",
      "type": "Number",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "email",
      "type": "String",
      "default_value": "",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "password",
      "type": "String",
      "default_value": "",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "reset_password_token",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "reset_password_sent_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "remember_created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "sign_in_count",
      "type": "Number",
      "default_value": "0",
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "current_sign_in_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []

from .forest-admin-schema.json (part 2):

    }, {
      "field": "last_sign_in_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "created_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "updated_at",
      "type": "Date",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "admin",
      "type": "Boolean",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "first_name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "last_name",
      "type": "String",
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": true,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": null,
      "inverse_of": null,
      "widget": null,
      "validations": []
    }, {
      "field": "houses",
      "type": ["Number"],
      "default_value": null,
      "enums": null,
      "integration": null,
      "is_filterable": false,
      "is_read_only": false,
      "is_required": false,
      "is_sortable": true,
      "is_virtual": false,
      "reference": "House.id",
      "inverse_of": "user",
      "relationship": "HasMany",
      "widget": null,
      "validations": []
    }],
    "segments": [],
    "actions": [{
      "name": "Change password",
      "type": "bulk",
      "base_url": null,
      "endpoint": "forest/actions/change-password",
      "http_method": "POST",
      "redirect": null,
      "download": false,
      "fields": [{
        "field": "New password",
        "type": "String",
        "default_value": null,
        "enums": null,
        "is_required": false,
        "reference": null,
        "description": null,
        "position": 0,
        "widget": null
      }],
      "hooks": {
        "load": false,
        "change": []
      }
    }]
  }],
  "meta": {
    "database_type": "postgresql",
    "liana": "forest-rails",
    "liana_version": "5.4.4",
    "orm_version": "6.1.2.1"
  }
}

When I go to an existing photo blob within a house record and I try to replace one of the photos with a new one I get this error:

Hi again, @OKMantis,

Sorry, I’ve asked to my teammates, and we do not provide Cloudinary support out-of-the-box.

We plan to support this but it is not prioritized, we do not have any ETA for this.
I am pushing your request to our product board to speed-up

I suggest you override the route in order to use your today code.
Information about overriding routes can be found here

1 Like

Ok thank you, it would be great to have that. In the mean time I’ll have a look at the alternative way.