我遇到了一個奇怪的情況。這就是為什么我最終在 Stackoverflow 上發帖的原因......
基本上,我有一個 Ruby on Rails 6.1 應用程式,在生產環境中運行,我最近在其上實作了 Cloudinary(替換 Amazon S3)。Cloudinary 允許獲得具有自定義大小和格式的優化圖片,因此使用起來非常棒。
但是我有一個問題cl_image_tag。
在本地環境中運行我的代碼時:
把它放在development.rb中:
config.active_storage.service = :local
導致此標簽無法獲取圖片。因為它錯過了存盤影像的主檔案夾(my_app/)
<%= cl_image_tag("homepage/banner.webp", quality: 'auto', width: 1932, height: 904) %>
所以如果我想讓它作業,我必須寫這個:
<%= cl_image_tag("my_app/homepage/banner.webp", quality: 'auto', width: 1932, height: 904) %>
但是如果我這樣做,那么我的生產環境將失敗,因為它使用:
開發.rb:
config.active_storage.service = :cloudinary
index.html.erb :
<%= cl_image_tag("homepage/banner.webp", quality: 'auto', width: 1932, height: 904) %>
.env :
MEDIA_FOLDER_NAME_IN_CLOUDINARY=my_app
因此,我發現自己陷入了一種僅在本地作業的配置和一種僅在生產中作業的配置之間。有沒有搞錯 ?!我錯過了什么?我在 StackOverflow 或 Cloudinary 的檔案中找不到任何內容。
編輯:我的第一個猜測是MEDIA_FOLDER_NAME_IN_CLOUDINARYenv 變數僅在出現此行時才加載到代碼中:
config.active_storage.service = :cloudinary
但是我不能在我的本地環境中使用它,因為我不希望我的本地影像被上傳并占用我的云存盤空間。所以我必須找到一個解決方法......
提前感謝任何幫助的人??
uj5u.com熱心網友回復:
Cloudinary SDK 是為從您的 Cloudinary 帳戶而不是從本地環境交付資產而設計的,因此cl_image_tag輔助方法未配置為在生成 URL 時檢查本地應用程式的完整路徑,而只是根據路徑創建它作為第一個引數和可選轉換引數提供的字串。
Cloudinary 可以選擇在高級計劃或更高版本中在同一父帳戶下創建子帳戶,因此您可以為您的開發環境和生產環境提供一個云。每個都有自己的 API 憑據,您可以根據其運行的環境將其添加為環境變數。
如果您的計劃低于高級計劃,您可以使用兩個不同的電子郵件地址創建兩個單獨的帳戶,以便一個用于開發,另一個用于生產(這兩個不會共享相同的配額。每個都有它自己的)。代碼方面,它看起來與將兩個云放在同一個父帳戶下相同。您仍將獲得每個云的不同 API 憑據。唯一的區別是當您登錄您的帳戶時,您將無法在不同的子帳戶之間無縫切換,但您需要在需要時注銷并登錄到另一個帳戶。
如果您更喜歡走這條路,您也可以繼續使用建議的解決方法。這非常好,因為它不需要您分叉存盤庫并將其與未來的更新分離。
uj5u.com熱心網友回復:
您也可以在開發中使用 cloudinary,使其具有與生產環境中基本相同的設定,這樣它將從 cloudinary 而不是您的本地計算機獲取影像。
# config/environments/development.rb
config.active_storage.service = :cloudinary
uj5u.com熱心網友回復:
好的,我找到了解決此問題的“解決方法”,即使我確定這不是理想的解決方案并且我不應該遇到此問題。因此,在有人為我提供更好的解決方案之前,這是我的:
application_helper.rb:
Rails.env == 'production' ? '' : "#{ENV['MEDIA_FOLDER_NAME_IN_CLOUDINARY']}/"
application_helper.html.erb:
<%= cl_image_tag("#{cloudinary_folder}homepage/banner.webp", quality: 'auto', width: 1932, height: 904) %>
使用這個助手可以讓我在生產環境中將 cloudinary_folder 設定為“”,在開發環境中設定為“my_app/”。
注意:如果您認為我可以只使用 ENV 變數。M.. 不,我不能。因為在生產中,Cloudinary 的 cl_image_tag 使用相同的 ENV 變數來設定它需要存盤上傳影像的檔案夾,并獲取靜態影像。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/426345.html
