2013-01-09 18 views
8

我有一個Artwork模型,其中載有Carrierwave的圖片屬性。在編寫控制器規範時,我意識到圖像字段保持空白,即使當我認爲我傳入文件對象時也是如此。我需要在控制器中傳遞哪些參數到Carrierwave-mounted模型?

我的調試信息告訴我,問題出在我載有CarrierWave的圖像屬性上,而不是別的。我不認爲我傳遞了它需要的信息,但我不知道該怎麼嘗試。

這裏的控制器動作,以及一些調試信息,以確定問題:

def create 
    @artwork = @imageable.artworks.new(params[:artwork]) 
    logger.debug "Artwork should be valid: #{@artwork.valid?}" 
    logger.debug "Errors: #{@artwork.errors.full_messages}" 
    if @artwork.save 
     flash[:success] = "Artwork created." 
     redirect_to [@imageable, :artworks] 
    else 
     flash[:error] = "Artwork not created." 
     render :new 
    end 
end 

在測試日誌我看到這個運行我的規格後:

Processing by ArtworksController#create as HTML 
    Parameters: {"artwork"=>{"image"=>"#<File:0x4515480>", "title"=>"Portrait","year"=>"2012", "surface_type"=>"canvas", "size"=>"10 x 10", "price"=>"100.0", "for_sale"=>false, "prints_available"=>false, "notes"=>"extra notes"}, "file"=>"#<File:0x46c6938>", "originals_gallery_id"=>"1"} 
[1m[36mOriginalsGallery Load (0.0ms)[0m [1mSELECT "originals_galleries".* FROM "originals_galleries" WHERE "originals_galleries"."id" = ? LIMIT 1[0m [["id", "1"]] 
Artwork should be valid: false 
Errors: ["Image can't be blank"] 

有什麼想法嗎?有沒有我忘記設置的控制器參數?

回答

17

我的問題是一個更一般的問題:在我的測試過程中(使用Rspec和FactoryGirl),我將錯誤類型的文件對象傳遞給控制器​​操作。這是我定義爲我的圖像屬性對象的類型:

FactoryGirl.define do 
    factory :artwork do 
    image { File.open(File.join(Rails.root, 'spec', 'support', 'sample.gif')) } 
    ...other attributes omitted 
    end 
end 

The above is the setup that Carrierwave docs recommended for FactoryGirl test fixtures.它爲測試模型和最控制器動作,但不能用於創建行動。

我的測試日誌告訴我我的圖像屬性是空白的,儘管傳入了這個File對象。經過一番搜索,我發現你可以通過一個Rack :: Test :: UploadedFile的實例(我認爲ActionDispatch :: Http :: UploadedFile是通過瀏覽器(?)提交的)。

因此,我沒有在工廠將image屬性設置爲File.open(...),而是將其設置爲Rack::Test::UploadedFile.new(Rails.root.join("spec/support/sample.gif"))。我的控制器規格已通過,文件上傳已保存到數據庫。

我認爲這有助於解釋爲什麼很多人在瀏覽器中見證成功的文件上傳,而不是在他們的測試或驗證中。

This post about testing file attachments in Rails 3 really helped

+0

卡住試圖解決同樣的問題。太感謝了! – wyclin

相關問題