[英]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.