簡體   English   中英

Rails Carrierwave和Imagemagick,使用條件調整圖像大小

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

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