Как использовать Sinatra, Datamapper, DM-Paperclip и S3?

Обновление: я перешел на CarrierWave (наконец-то он заработал), поэтому, хотя я все еще ценю ответы на этот вопрос, я не смогу попробовать, действительно ли они работают, поскольку я я полностью удалил DM-Paperclip из своего кода.


Всем привет,

Я разрабатываю Sinatra-webapp с использованием DataMapper и теперь хочу добавить некоторые функции загрузки с S3 в качестве хранилища. Я пробовал CarrierWave, но не смог заставить это работать, поэтому теперь пробую dm- скрепка. Это то, что у меня есть прямо сейчас:

Модель:

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, и я также не получаю никаких ошибок.

Любые идеи, что я делаю неправильно?


person Marc    schedule 12.03.2011    source источник


Ответы (3)


Привет! Пожалуйста, попробуйте мой форк: https://github.com/solnic/dm-paperclip он включает в себя множество патчи, которые исправили некоторые проблемы с S3. Через месяц-два выложу.

person solnic    schedule 12.03.2011
comment
Выдает ошибку: неинициализированная константа ActiveSupport::Inflector (и я не использую ActiveSupport) - person Marc; 13.03.2011

Помимо уже опубликованных решений, я хотел бы добавить рекомендацию.

По моему опыту, использование функции 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 при попытке сохранить вашу модель. Я нахожу это очень полезным не только для отладки, но и для показа этих сообщений потребителям моего приложения.

person fsaravia    schedule 18.09.2012

Некоторое время назад я делал свой форк специально для S3. Мой форк работает с официальным AWS-SDK, а не со старым aws-s3, который в основном устарел.

Если кто-то будет искать решение S3 для скрепки, это то, что работает (сегодня).

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

взгляните на readme, чтобы узнать, как настроить скрепку для S3

person Marcin    schedule 23.03.2013