datamapper とcarrierwave を使用する非常にシンプルな sinatra アプリがあります。
アップローダを最小限に減らしました。
class PhotoUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
end
そして、それを使用する単純なモデルを 1 つ用意します。
class Photo
include DataMapper::Resource
property :id, Serial
property :caption, String
property :position, Integer
property :created_at, DateTime
property :updated_at, DateTime
mount_uploader :source, PhotoUploader
belongs_to :album
end
それを使用すると、次のことが起こります。
post '/admin/album/:id/photo/create' do
album = Album.get(params[:id])
photo = Photo.create(params[:photo])
album.photos << photo
album.save!
redirect '/admin/album'
end
photo
はデータベース上に正常に作成されており、ファイルは正常にキャッシュ ディレクトリにアップロードされていますが、最終的な保存先には移動されていません。
私は Carrierwave コードに入り、メソッドが呼び出されているが、cache!
メソッドが呼び出されていないことを確認できましたstore!
。
オブジェクトに関連付けずにアップローダを使用しようとしました:
get '/lorem' do
f = File.open('test.png')
u = PhotoUploader.new
u.store!(f)
"ok"
end
この場合、すべてが期待どおりに機能します。
==================== 更新 ====================
問題の原因を見つけたと思います。デバッガーを実行しているときに、次のようになりました。
gems/dm-core-1.2.0/lib/dm-core/query.rb:1014
conditions.each do |condition|
(rdb:1)
gems/carrierwave-0.6.2/lib/carrierwave/sanitized_file.rb:290
def sanitize(name)
(rdb:4)
gems/carrierwave-0.6.2/lib/carrierwave/sanitized_file.rb:299
def split_extension(filename)
(rdb:4)
gems/carrierwave-0.6.2/lib/carrierwave/sanitized_file.rb:29
self.file = file
(rdb:4)
gems/carrierwave-0.6.2/lib/carrierwave/sanitized_file.rb:269
if file.is_a?(Hash)
(rdb:4)
gems/carrierwave-0.6.2/lib/carrierwave/sanitized_file.rb:274
@file = file
(rdb:4) pp file
"/Users/jvalente/Projects/dummy/public/uploads/{:filename=>\"Screen Shot 2013-01-24 at 4.57.15 PM.png\", :type=>\"image/png\", :name=>\"photo[source]\", :tempfile=>#<File:/var/folders/jp/wm1gxk8558d36rh9vzkmx4jw0000gn/T/RackMultipart20130128-27245-105ybbf>, :head=>\"Content-Disposition: form-data; name=\\\"photo[source]\\\"; filename=\\\"Screen Shot 2013-01-24 at 4.57.15 PM.png\\\"\\r\\nContent-Type: image/png\\r\\n\"}"
これは明らかに間違っており、file.is_a?(Hash)
条件を満たせず、次のようになります。
@file = file
@original_filename = nil
@content_type = nil
それでも、なぜこれが起こるのか理解できません。