2013-01-09 6 views
8

Mam model Artwork z atrybutem obrazu, w którym zamontowano Carrierwave. Pisząc specyfikacje kontrolera, zdałem sobie sprawę, że pole obrazu pozostaje puste, nawet gdy myślałem, że przechodzę przez obiekt pliku.Jakie parametry muszę przekazać w kontrolerze do zamontowanego modelu Carrierwave?

Moje informacje na temat debugowania informują mnie, że problem dotyczy atrybutu obrazu, na którym mam zainstalowany CarrierWall, a nie czegoś innego. Nie sądzę, żebym przekazywał potrzebne informacje, ale nie wiem, co spróbować.

Oto działanie regulatora, z niektórych informacji debugowania w celu zidentyfikowania problemu:

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 

W dzienniku testowym Widzę to po uruchomieniu moje specyfikacje:

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"] 

Każdy myśli, proszę? Czy istnieje kontroler, którego zapominam?

Odpowiedz

17

Mój problem był bardziej ogólny: podczas moich testów (z Rspec i FactoryGirl) przechodziłem w niewłaściwym rodzaju obiektu pliku do akcji kontrolera. Jest to rodzaj obiektu byłem definiowania atrybutu dla mojego obrazu:

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. Działało do testowania modelu, a większość działań kontrolerów, ale nie dla stworzenia działania.

Moje logi testowe mówiły mi, że mój atrybut obrazu był pusty, pomimo podania tego obiektu File. Po kilku poszukiwaniach dowiedziałem się, że można przekazać w instancji Rack :: Test :: UploadedFile (Myślę, że ActionDispatch :: Http :: UploadedFile jest to, co zostało przesłane za pośrednictwem przeglądarki (?)).

Dlatego zamiast atrybutu image ustawiono fabrycznie na File.open(...), ustawiłem go na Rack::Test::UploadedFile.new(Rails.root.join("spec/support/sample.gif")). Moje specyfikacje kontrolera minęły, a przesyłanie plików zostało zapisane w bazie danych.

Myślę, że to pomaga wyjaśnić, dlaczego wiele osób jest świadkami pomyślnego przesłania plików w przeglądarce, ale nie w ich testach ani walidacjach.

This post about testing file attachments in Rails 3 really helped.

+0

Utknął próbując rozwiązać ten sam problem. Stukrotne dzięki! – wyclin

Powiązane problemy