簡體   English   中英

活動存儲導軌保存 blob 和附件數據,但存儲中沒有文件

[英]Active storage rails save the blobs and attachments data but no file in storage

我正在使用 spree 開發在線商店應用程序。 用戶希望在購物車表單中上傳文件圖像(當然如果不進行下一步,數據將在幾個小時內自動刪除)。 它將為一個選定的變體提供一個附件。 所以因為它使用主動存儲,我必須在 line_item.rb 中聲明has_one_attached:user_file_attachment line_item.rb add_item.rb里面我正在使用這些代碼

if line_item.nil?
    opts = ::Spree::PermittedAttributes.line_item_attributes.flatten.each_with_object({}) do |attribute, result|
    result[attribute] = options[attribute]
    end.merge(currency: order.currency).delete_if { |_key, value| value.nil? }

    line_item = order.line_items.new(quantity: quantity,
                                           variant: variant,
                                           options: opts)
else
    line_item.quantity += quantity.to_i
end

# here where i place the code to attach the file. I'm using dummy method first.
line_item.user_file_attachment.attach(
            io: File.open('D:\SamplePic\Sample.jpg'),
            content_type: 'image/jpeg',
            filename: 'file_' + Time.zone.now.to_s + '.jpg'
)

它創建[active_storage_blobs]數據和[active_storage_attachments]數據。 但如果我檢查存儲內部,則沒有創建任何內容。

但。 如果我使用order而不是line_item ,它會在存儲中創建數據 blob、附件和文件。


# here where i place the code to attach the file. I'm using dummy method first.
order.user_file_attachment.attach(
            io: File.open('D:\SamplePic\Sample.jpg'),
            content_type: 'image/jpeg',
            filename: 'file_' + Time.zone.now.to_s + '.jpg'
)

如果我檢查order.user_file_attachment.attached? line_item.user_file_attachment.attached? 兩者都是返回 true。 但是我在控制台中看到,命令一個有語句Disk Storage (9.3ms) Uploaded file to key....

Spree::Order Update (0.9ms)  EXEC sp_executesql N'UPDATE [spree_orders] SET [payment_state] = @0, [shipment_state] = @1, [item_total] = @2, [item_count] = @3, [adjustment_total] = @4, [included_tax_total] = @5, [additional_tax_total] = @6, [payment_total] = @7, [shipment_total] = @8, [promo_total] = @9, [total] = @10, [updated_at] = @11 WHERE [spree_orders].[id] = @12; SELECT @@ROWCOUNT AS AffectedRows', N'@0 nvarchar(4000), @1 nvarchar(4000), @2 decimal(10,2), @3 int, @4 decimal(10,2), @5 decimal(10,2), @6 decimal(10,2), @7 decimal(10,2), @8 decimal(10,2), @9 decimal(10,2), @10 decimal(10,2), @11 datetime2(6), @12 int', @0 = NULL, @1 = NULL, @2 = N'4.5', @3 = 1, @4 = N'0.0', @5 = N'0.0', @6 = N'0.0', @7 = N'0.0', @8 = N'0.0', @9 = N'0.0', @10 = N'4.5', @11 = '01-27-2021 09:45:35.150663', @12 = 1  [["payment_state", nil], ["shipment_state", nil], ["item_total", nil], ["item_count", nil], ["adjustment_total", nil], ["included_tax_total", nil], ["additional_tax_total", nil], ["payment_total", nil], ["shipment_total", nil], ["promo_total", nil], ["total", nil], ["updated_at", nil], ["id", nil]]
  ↳ app/models/spree/order_updater.rb:105:in `persist_totals'
  Spree::Order Update (3.2ms)  EXEC sp_executesql N'UPDATE [spree_orders] SET [updated_at] = @0 WHERE [spree_orders].[id] = @1; SELECT @@ROWCOUNT AS AffectedRows', N'@0 datetime2(6), @1 int', @0 = '01-27-2021 09:45:34.429746', @1 = 1  [["updated_at", nil], ["id", nil]]
  ↳ app/services/spree/cart/add_item.rb:7:in `call'
  SQL (2.1ms)  COMMIT TRANSACTION
  ↳ app/services/spree/cart/add_item.rb:7:in `call'
  Disk Storage (9.3ms) Uploaded file to key: k69f7oi6lw6syk9v9evzkju3hkbx (checksum: orCuROlkMY7nw54l/uQ+DQ==)
[ActiveJob] Enqueued ActiveStorage::AnalyzeJob (Job ID: 3a364a95-9757-4cf9-b501-688f6cada68e) to Async(active_storage_analysis) with arguments: #<GlobalID:0x0000000012aa2230 @uri=#<URI::GID gid://spree-ecommerce/ActiveStorage::Blob/570>>

但是如果我使用line_item,它不會有Disk Storage (9.3ms) Uploaded file to key...

順便說一句,如果我錯了,請糾正我。 我還是新手使用 Spree,還在學習結構。

已經找到方法了。 但我不知道有沒有更好的方法。 隨意評論我的錯誤。 ;)。

我查看了 output 以及我可以做出什么可能性,我發現:我無法將這些代碼放入add_item.rb甚至為此文件中的 function 創建另一個函數/過程。 然后,我注意到只有第一次出現問題,第二次提交時,代碼按預期工作。

因此,在add_item.rb中,我在add_item過程中的result之后將它放在cart_controller.rb中。

def add_item
    spree_authorize! :update, spree_current_order, order_token
    spree_authorize! :show, @variant
    result = add_item_service.call(
        order: spree_current_order,
        variant: @variant,
        quantity: params[:quantity],
        options: params[:options]
    )

    # result.value = its line_item obj

    # here where i place the code to attach the file. I'm using dummy method first.
    result.value.user_file_attachment.attach(
        io: File.open('D:\SamplePic\Sample.jpg'),
        content_type: 'image/jpeg',
        filename: 'file_' + Time.zone.now.to_s + '.jpg'
    )

    render_order(result)
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM