2011-12-01 68 views
1

我正在使用Rails和ActiveRecord。 我有載波安裝在模型(Listing)的一列(:logo)上。我的默認文件名是"disp_logo"。假設我只是做Listing.create!在這種情況下,我沒有真正上傳任何文件。我沒有做Listing.logo=<some file>Listing.remote_logo_url=<some url>。但是,carrierwave仍然在:logo列中插入字符串"disp_logo"。它爲什麼這樣做?我怎樣才能防止carrierwave這樣做?如何防止carrierwave在未上傳文件時將文件名字符串添加到裝入的列中?

我上傳類有以下方法:

def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

def filename 
    "disp_logo" 
end 

這就是我說的默認文件名。 我想:logoNULL如果圖像沒有上傳。相反它有"disp_logo"

回答

0

我想出了一個更適合我的用例的解決方案。

class LogoUploader < CarrierWave::Uploader::Base 
    attr_accessor :upload_failed 

    def filename 
    upload_failed ? "failed" : "disp_logo" 
    end 
end 

class SomeModel < ActiveRecord::Base 
    mount_uploader :logo, LogoUploader 

    def some_method_that_assigns_a_file_and_uploads_it 
    self.remote_logo_url = <some_url> 
        OR 
    self.logo = <some file> 
    <some_other_logic> 
    save! 
    rescue 
    logo.upload_failed = true 
    save! 
    end 
end 

這樣一來,我知道哪些記錄進行處理:logo #=> "disp_logo",記錄失敗:logo #=> "failed"和它們尚未處理:logo #=> nil

1

看起來您已將您的遷移創建爲「disp_logo」作爲您列的默認值。你應該在你上傳設置的默認圖像,而不是像這樣:

# Provide a default URL as a default if there hasn't been a file uploaded: 
    def default_url 
    "/" + [version_name, "disp_logo.jpg"].compact.join('_') 
    end 

或者,如果您使用軌道3.1和資產管道:

# Include the Sprokets helpers for Rails 3.1+ asset pipeline compatibility: 
    include Sprockets::Helpers::RailsHelper 
    include Sprockets::Helpers::IsolatedHelper 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    def default_url 
    asset_path [version_name, "disp_logo.jpg"].compact.join('_') 
    end 

編輯:

修改您的filename方法如下:

def filename 
    "something.jpg" unless original_filename.nil? 
    end 
+0

謝謝!但那不完全是我的意思。我編輯了我的問題。 –

+0

啊是的!當然!這工作。謝謝! –

+0

查看更新... – rabusmar

相關問題