更新:我已切换到CarrierWave(终于让它工作了),所以虽然我仍然很欣赏这个问题的答案,但如果他们确实工作我将无法尝试因为我已从我的代码中完全删除了DM-Paperclip 。
你好,
我正在使用DataMapper开发一个Sinatra-webapp,现在正在寻求添加一些上传功能,将S3作为存储。我已经尝试了CarrierWave,但我无法让它工作,所以现在我正在尝试dm-paperclip。这就是我现在所拥有的:
型号:
class Article
include DataMapper::Resource
include Paperclip::Resource
property :id, Serial
property :created_at, DateTime
property :updated_at, DateTime
property :title, String
property :body, Text
has_attached_file :screenshot,
:storage => :s3,
:s3_credentials => {
:access_key_id => 'my-access-key-id',
:secret_access_key => 'my-secret_access-key',
:bucket => 'my-bucket'
},
:styles => {
:medium => "300x300>",
:thumb => "100x100>"
}
end
控制器:
post '/articles/create' do
@article = Article.new
@article.title = params[:title]
@article.body = params[:body]
@article.screenshot = params[:screenshot]
begin
@article.save
rescue DataMapper::SaveFailureError => e
puts "Error saving article: #{e.to_s} validation: #{@article.errors.values.join(', ')}"
rescue StandardError => e
puts "Got an error trying to save the article #{e.to_s}"
end
redirect '/articles'
end
然而,当我创建一篇新文章时,它并没有将任何内容保存到我的S3存储桶中,也没有出现任何错误。
任何想法我做错了什么?
答案 0 :(得分:2)
喂!请尝试我的前叉:https://github.com/solnic/dm-paperclip它包含许多已修复S3问题的补丁。在一两个月内,我将发布它。
答案 1 :(得分:1)
除了已经发布的解决方案,我想添加一个推荐。
根据我的经验,使用DataMapper的raise_on_save_failure
功能对调试选项没什么帮助。我建议您禁用该功能并使用以下代码:
if model.save then
return model
else
error = String.new
model.errors.each do |e|
error << "#{e[0]}\n"
end
raise ArgumentError, error
end
这样,您将获得DM在尝试保留模型时遇到的每个问题的完整说明。我发现它不仅对调试非常有用,而且对于向我的应用程序的使用者显示这些消息也非常有用。
答案 2 :(得分:0)
前段时间我特意为S3做了叉子。我的fork使用官方AWS-SDK,而不是旧的aws-s3,这大部分已经过时了。
如果有人会为回形针搜索S3解决方案,那么这是一个可行的(今天)
https://github.com/krzak/dm-paperclip-s3
看一下自述文件,了解如何为S3配置回形针