[英]Rails Carrierwave & Imagemagick, using conditions to resize image
我一直在努力尋找任何教程或問題來解釋如何根據用戶提供的某些條件上傳圖像並調整其大小。
我可以輕松地使用硬編碼值來上載圖像並調整圖像的大小,但是我一直堅持使用用戶提供的參數來從上載器進行訪問。
我希望根據用戶將圖像檢查為大還是小,將圖像調整為800x600或300x300。
為此,我在模型結構中有一個名為“ large”的布爾列。
在Uploader中,我可以在store_dir塊中輕松訪問模型及其值,但是在該塊之外的任何地方,任何模型屬性都將返回nil。
這就是我想做的:
class BannerUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
resize_to_fit(800,600) if model.large==true
resize_to_fit(300,300) if model.large!=true
end
但是,這會返回BannerUploader:Class的錯誤未定義局部變量或方法“ model”
如何解決這個問題。
要處理原始文件,您可以指定自定義方法:
class BannerUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
process :process_original_version
def process_original_version
if model.large
resize_to_fit(800,600)
else
resize_to_fit(300,300)
end
end
end
對於特定版本:
class BannerUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :normal do
if model.large
process resize_to_fit: [800,600]
else
process resize_to_fit: [300,300]
end
end
end
好的,@ Alex Kojin的回答正確。 但是我也面臨另一個問題。 當用戶提交表單時,由於某些原因,將首先執行圖像調整大小過程,然后將“ large”屬性設置為true,因此圖像將始終被調整為較小的大小(300x300)。 因此,上傳器始終將model.large設置為false。 所以這就是我必須改變動作控制器的方式
def create
@banner=Banner.new
@banner.large=params[:large]
@banner.update_attributes(banner_params)
@banner.save
redirect_to :back
end
不知道這是否是正確的方法,但是對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.