【问题标题】:How to use Sinatra, Datamapper, DM-Paperclip and S3?如何使用 Sinatra、Datamapper、DM-Paperclip 和 S3?
【发布时间】:2011-07-14 04:39:01
【问题描述】:

更新:我已经切换到 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 存储桶中,而且我也没有收到任何错误。

任何想法我做错了什么?

【问题讨论】:

    标签: ruby amazon-s3 paperclip sinatra datamapper


    【解决方案1】:

    嘿!请尝试我的 fork:https://github.com/solnic/dm-paperclip 它包含许多修复了 S3 一些问题的补丁。一两个月内我会发布它。

    【讨论】:

    • 抛出错误:“未初始化的常量 ActiveSupport::Inflector”(而且我没有使用 ActiveSupport)
    【解决方案2】:

    除了已经发布的解决方案,我想添加一个建议。

    根据我的经验,使用 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 在尝试持久化模型时遇到的每个问题的完整解释。我发现它不仅对于调试非常有用,而且对于向我的应用程序的消费者显示这些消息也非常有用。

    【讨论】:

      【解决方案3】:

      前段时间,我特别为 S3 做了分叉。我的 fork 使用官方的 AWS-SDK,而不是大部分已经过时的旧的 aws-s3。

      如果有人会搜索回形针的 S3 解决方案,这是一个可行的解决方案(今天)

      https://github.com/krzak/dm-paperclip-s3

      查看自述文件以了解如何为 S3 配置回形针

      【讨论】:

        猜你喜欢
        • 2011-10-23
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        相关资源
        最近更新 更多