使用活动存储has_one_attached时,堆栈级别太深:

时间:2019-01-26 08:27:30

标签: ruby-on-rails rails-api

我正在尝试为Ruby on Rails API项目实现Active Storage。我已经根据文档放置了has_one_attached:picture。并成功将图片上传到AWS S3服务上。现在,当我尝试访问志愿者数据时会说

ActiveStorage::Attachment Load (0.6ms)  SELECT  "active_storage_attachments".* FROM "active_storage_attachments" WHERE
     

“ active_storage_attachments”。“ record_id” = $ 1并且   “ active_storage_attachments”。“ record_type” = $ 2并且   “ active_storage_attachments”。“名称” = $ 3 LIMIT $ 4 [[“” record_id“,   8695],[“ record_type”,“ Volunteer”],[“ name”,“ picture”],[“ LIMIT”,   1]]         ActiveStorage :: Blob加载(0.4ms)从“ active_storage_blobs”中选择“ active_storage_blobs”。   “ active_storage_blobs”。“ id” = $ 1 LIMIT $ 2 [[“ id”,5],[“ LIMIT”,1]]       [active_model_serializers]呈现的ActiveModel :: Serializer :: Null与ActiveStorage :: Attached :: One(58.41ms)       在322毫秒内完成500个内部服务器错误(ActiveRecord:48.8毫秒)

SystemStackError (stack level too deep):

我已经通过Rails控制台检查了数据,并且图像保存在picture属性中。志愿者的架构如下

架构

create_table "volunteers", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.string "full_name"
    t.string "mobile"
    t.string "picture"
    t.boolean "kit"
    t.boolean "training"
    t.boolean "car"
    t.boolean "test"
    t.bigint "team_id"
    t.bigint "education_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.jsonb "attendance", default: []

  end

当我注释掉

has_one_attached :picture

在我的志愿者模型中,它可以正常工作,并向我返回json对象,而没有任何错误。

我该如何解决堆栈级别太深的错误?

1 个答案:

答案 0 :(得分:2)

更新后的答案:

在我的情况下,此问题的根本原因是模型中的字段具有相同的名称(表中的列)与附件相同,这是不需要的,因为Active Storage使用单独的表。而当to_json 在这样的模型对象上调用,会导致堆栈级别过深的错误。 从数据库中删除该列后,问题就消失了。

我看到您的模型也遇到同样的情况,所以我建议您从表picture中删除列volunteers

原始答案:

我只是遇到了同样的问题。现在,我通过省略json生成的附件解决了它。 就您而言,就像

@volunteer.to_json(except: :picture)

或使用响应者

respond_with @volunteer, except: :picture

format.json { render json: @volunteer, except: :picture }