8

Carrierwave がマウントされている画像属性を持つアートワーク モデルがあります。コントローラーの仕様を書いているときに、ファイル オブジェクトを渡していると思っていても、画像フィールドが空白のままであることに気付きました。

デバッグ情報によると、問題は 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"]

何か考えはありますか?設定し忘れているコントローラーパラメーターはありますか?

4

1 に答える 1

18

私の問題はより一般的なものでした: テスト (Rspec と FactoryGirl を使用) 中に、間違った種類のファイル オブジェクトをコントローラー アクションに渡していました。これは、イメージ属性に定義していた種類のオブジェクトです。

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

上記は、Carrierwave のドキュメントが FactoryGirl テスト フィクスチャに推奨するセットアップです。モデルとほとんどのコントローラー アクションのテストでは機能しましたが、作成アクションでは機能しませんでした。

私のテストログは、このファイルオブジェクトを渡したにもかかわらず、画像属性が空白であることを教えてくれました。いくつかの検索の後、Rack::Test::UploadedFile のインスタンスを渡すことができることがわかりました (ActionDispatch::Http::UploadedFile はブラウザー (?) を介して送信されたものだと思います)。

そのため、ファクトリでimage属性を に設定する代わりに、に設定しました。コントローラーの仕様に合格し、ファイルのアップロードがデータベースに保存されました。File.open(...)Rack::Test::UploadedFile.new(Rails.root.join("spec/support/sample.gif"))

これは、多くの人がブラウザーでファイルのアップロードが成功するのを目撃するのに、テストや検証では成功しない理由を説明するのに役立つと思います.

Rails 3 での添付ファイルのテストに関するこの記事は本当に役に立ちました。

于 2013-01-09T20:40:47.977 に答える