使用sinatra和datamapper以及Carrierwave在ruby中上传图像?

时间:2012-06-23 15:04:23

标签: ruby sinatra datamapper carrierwave

我想用Carrierwave上传一个图像,就是上传文件并将其保存到目录上传中,在这个文件夹中创建另一个名为tmp的文件夹,在tmp文件夹中创建另一个文件夹包括图像。 事情是它似乎并没有停止上传,上传和上传,即使图像完全上传到该文件夹​​,我可以用feh(或任何其他图像浏览器)打开这个图像。

这就是我的控制器的样子。

get "/new" do
    protect!

    erb :new
end

post "/new" do
    protect!

    @user = User.get(session[:user_id])
    image = @user.image.new(
        :description => params[:description],
        :image => params[:image]
    )

    # image.save

    "NEVER REACHED!"

end

(文本“永远不会到达!”根本不会显示,我不知道为什么......)

这是我的模特:

class ImageUploader < CarrierWave::Uploader::Base
    def extensions_white_list
        %w(jpg jpeg gif png)
    end

    storage :file
end

class Image
    include DataMapper::Resource

    property :id, Serial
    property :description, Text

    property :image, String, :auto_validation => false
    mount_uploader :image, ImageUploader
end

class User
    include DataMapper::Resource

    property :id, Serial

    has n, :post
end

正如已经提到的,从未达到过“永远不会达到”的文本。任何想法为什么?

此外,我总是收到警告:

Defining property for an uploader is deprecated at /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

我不知道为什么......

UPDATE:只要我不在主控制器中取消注释image.save,它就会以某种方式工作,但我实际上需要取消注释,任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

将图片模型中的property :image行删除为:

class Image
    include DataMapper::Resource

    property :id, Serial
    property :description, Text

    mount_uploader :image, ImageUploader
end

mount_uploader本身将:image定义为String类型。

尝试在此之后运行您的应用程序,并让我知道条件是否保持不变。 :)