アプリの中で書類をS3にアップロードする機能を作っています。
試しに新機能のActiveStorageを使っていますが、エラーに当たってしまいました。
環境
Ruby 2.6.7
Rails 6.1.4.1
activestorage (6.1.4.1)
Amazon S3
エラー
書類(Paper)オブジェクトを作成と同時にparamsからファイルを取ってAmazonS3へアップロードするようにしています。
ただ、Seedを何度もしていたところ、普段見ないエラーが出て気づいたのですが、
Paperオブジェクト作成時に時に10回に1回ほどエラーが出ることがわかりました。
NoMethodError in PapersController#create
undefined method `attachment_reflections' for nil:NilClass
エラーが出る箇所
Controllers/PapersController.rb
class PapersController < ApplicationController ︙ def create @paper = Paper.new(new_paper_params) if @paper.save! redirect_to input_paper_url(@paper) else render :new end end ︙ def new_paper_params params.require(:paper).permit(:name).merge(company: current_company).merge(pdf: params[:paper][:pdf]) end ︙ end
models/paper.rb
Ruby:models/paper.rb
1class Paper < ApplicationRecord 2 has_one_attached :pdf 3 4 attribute :name, :string, default: '書類名未設定' 5 validates(:name, presence: true, length: {maximum: 255}) 6 validates(:pdf, attached: true, content_type: 'application/pdf') 7 validates(:keyword, length: {maximum: 65535}) 8 9 private 10 def set_id 11 while self.id.blank? || Paper.find_by(id: self.id).present? do 12 self.id = SecureRandom.hex(10) 13 end 14 end
config/environments/development.rb
Rails.application.configure do ︙ config.active_storage.service = :amazon ︙ end
ダイレクトアップロードは使っていません。
なにか問題のあるコードなのだと思いますが、解決の糸口がつかめません。
やってみたこと
ActiveStorageのアップロードは非同期らしいことはわかり、それが原因かと思い、
config/environments/development.rbに
Ruby:config/environments/development.rb
1Rails.application.configure do 2︙ 3 config.active_job.queue_adapter = :inline 4︙ 5end
を追記してみたのですが、エラーが出ます。
なにか他にありそうな原因だけでも思い当たる箇所がある方はいませんでしょうか?
また回避策的な解決方法でもなにかご教授いただけないでしょうか?
よろしくお願いいたします。
追記コード
db/schema.rb
Ruby:db/schema.rb
1ActiveRecord::Schema.define(version: 2021_09_27_090222) do 2 create_table "active_storage_attachments", charset: "utf8", force: :cascade do |t| 3 t.string "name", null: false 4 t.string "record_type", null: false 5 t.bigint "record_id", null: false 6 t.bigint "blob_id", null: false 7 t.datetime "created_at", null: false 8 t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" 9 t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true 10 end 11 12 create_table "active_storage_blobs", charset: "utf8", force: :cascade do |t| 13 t.string "key", null: false 14 t.string "filename", null: false 15 t.string "content_type" 16 t.text "metadata" 17 t.bigint "byte_size", null: false 18 t.string "checksum", null: false 19 t.datetime "created_at", null: false 20 t.string "service_name", null: false 21 t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true 22 end 23 24 create_table "active_storage_variant_records", charset: "utf8", force: :cascade do |t| 25 t.bigint "blob_id", null: false 26 t.string "variation_digest", null: false 27 t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true 28 end 29︙ 30︙ 31 create_table "papers", id: :string, charset: "utf8", force: :cascade do |t| 32 t.string "name" 33 t.text "keyword" 34 t.datetime "created_at", null: false 35 t.datetime "updated_at", null: false 36 end 37︙ 38︙ 39 add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" 40 add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" 41︙ 42︙ 43end
あなたの回答
tips
プレビュー