yartem
@yartem
frontend newbie

Rails 5.2 API-mode. Как пофиксить ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation «active_storage_blobs» does not exist)?

История данного вопроса достаточно объёмна. Поэтому, начало вот тут: Rails 5.2 API-mode. Как избавиться от ActiveSuppor...

Чем занимается InvalidSignature я таки выяснил. Отправляется таким как я, если метод verify из MessageVerifier считает, что обрабатываемое сообщение не было подписано правильно либо не было закодировано в Base64. И не надо меня спрашивать, что всё это значит. Я выяснил также и причины появления этого InvalidSignature: он появляется тогда, когда я отправляю null или даже пустую строку вместо файла. Ради эксперимента закомментировал в коде лишние аттачи:

class Testimonial < ApplicationRecord
  # has_one_attached :userpic
  has_one_attached :object_photo_1
  # has_one_attached :object_photo_2
  # has_one_attached :object_photo_3

  validates :name, presence: true
  validates :video, presence: true, if: Proc.new { |t| t.text.blank? }
  validates :text, presence: true, if: Proc.new { |t| t.video.blank? }
end


И теперь при отправке файла получаю такое вот сообщение:
Started POST "/admin/v1/testimonials" for ::1 at 2019-07-05 21:03:46 +0300
Processing by Admin::TestimonialsController#create as JSON
  Parameters: {"name"=>"sdfasdf", "patronymic"=>"", "surname"=>"", "userpic"=>"", "company"=>"", "object_photo_1"=>#<ActionDispatch::Http::UploadedFile:0x00007f22f450f3c0 @tempfile=#<Tempfile:/tmp/RackMultipart20190705-10176-bw9ytk.jpg>, @original_filename="filename.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"object_photo_1\"; filename=\"filename.jpg\"\r\nContent-Type: image/jpeg\r\n">, "object_photo_2"=>"null", "object_photo_3"=>"null", "video"=>"", "text"=>"sadfasdf"}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ /home/yart/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
  JwtBlacklist Exists (0.7ms)  SELECT  1 AS one FROM "jwt_blacklists" WHERE "jwt_blacklists"."jti" = $1 LIMIT $2  [["jti", "4b4d7516-32ce-4ec9-a654-d271be40bba0"], ["LIMIT", 1]]
  ↳ /home/yart/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98

Unpermitted parameter: :format
Completed 500 Internal Server Error in 6ms (ActiveRecord: 1.8ms)


ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  relation "active_storage_blobs" does not exist
LINE 8:                WHERE a.attrelid = '"active_storage_blobs"'::...
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
                     c.collname, col_description(a.attrelid, a.attnum) AS comment
                FROM pg_attribute a
                LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                LEFT JOIN pg_type t ON a.atttypid = t.oid
                LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
               WHERE a.attrelid = '"active_storage_blobs"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum
):

app/controllers/admin/testimonials_controller.rb:23:in `create'


И теперь тип ошибки как бы намекает, что у меня что-то не то в БД. Там даже английским по чёрному (ну, когда в терминале) написано, что неопределенная таблица, а ActiveRecord презрительно добавляет, что мол состояние-то у вас инвалидное, куда ж вы ломитесь?! Но я решительно не знаю, чем мне может помочь данная информация. Несколько раз перечитал вот это вот руководство: Attaching Files to Records, но либо я совсем не понимаю буржуйский, либо одно из двух, но я в упор не вижу разницы между моим кодом и тем, что приведён там. Или есть разница? Ну не просят они делать дополнительные миграции под аттачмент файлов! Ну вот нигде об этом не написано ни прямо ни косвенно! Ну откуда там эта ошибка в БД?!?! Ну подскажите кто-нибудь уже!!! Проект стоит, заказчик смотрит косо.

UPDATE
В общем, эту тему я пофиксил благодаря уважаемым комментаторам там, внизу. Но вопрос не закрылся полностью. Переношу его в другую тему, потому что название этой не соответствует сути нового развития событий.
  • Вопрос задан
  • 748 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Viktor_Dav
Active Storage uses two tables in your application’s database named active_storage_blobs and active_storage_attachments. After creating a new application (or upgrading your application to Rails 5.2), run rails active_storage:install to generate a migration that creates these tables. Use rails db:migrate to run the migration.

Взято с вашего источника.

Также, доставляет много боли продираться сквозь тонны лирики, воспоминаний о прошлом и искрометного юмора, чтобы добраться до сути вопроса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы