NameError (constante não inicializada Paperclip :: Storage :: S3 :: AWS):

91

Estou tentando incorporar imagens em meu aplicativo da web e continuo tendo esse erro depois de remover alguns recursos. Tudo se resumia ao meu controlador de aplicativo 'criar' e não tenho certeza de onde devo ir a partir daqui.

2015-02-06T20:30:12.292187+00:00 app[web.1]:    (1.9ms)  ROLLBACK
2015-02-06T20:30:12.296299+00:00 app[web.1]: NameError (uninitialized constant Paperclip::Storage::S3::AWS):
2015-02-06T20:30:12.296301+00:00 app[web.1]:   app/controllers/articles_controller.rb:24:in `create'
2015-02-06T20:45:14.691084+00:00 app[web.1]: [paperclip] saving /articles/images/000/000/013/original/git.jpeg
2015-02-06T20:45:14.698744+00:00 app[web.1]: Completed 500 Internal Server Error in 584ms
2015-02-06T20:45:14.700871+00:00 heroku[router]: at=info method=POST path="/articles" host=preston.herokuapp.com request_id=d9d02257-3616-4686-bce5-3d912cd528c2 fwd="76.22.102.38" dyno=web.1 connect=1ms service=698ms status=500 bytes=1754

Articles_controller.rb

class ArticlesController < ApplicationController
http_basic_authenticate_with name: "name", password: "password", except: [:index, :show]

    def index
        @articles = Article.all.order("created_at DESC")
    end

    def show
        @article = Article.find(params[:id])
    end

    def new
        @article = Article.new
    end 

    def edit
        @article = Article.find(params[:id])

    end

    def create
        @article = Article.new(article_params)

        if @article.save
          redirect_to @article
        else
            render 'new'
        end  
    end

    def update
        @article = Article.find(params[:id])

        if @article.update(article_params)
            redirect_to @article
        else
            render 'edit'
        end
    end

    def destroy
        @article = Article.find(params[:id])
        @article.destroy

        redirect_to articles_path
    end

    private

    def article_params
        params.require(:article).permit(:title, :text, :image)
    end
end

Gemfile

source 'https://rubygems.org'
ruby '2.0.0'

gem 'rails', '4.2.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'bootstrap-sass', '~> 3.3.3' 
gem 'autoprefixer-rails'
gem 'paperclip', '~> 4.2.1'
gem 'aws-sdk', '~> 2.0.22'

group :development, :test do
 gem 'byebug'
 gem 'web-console', '~> 2.0'
 gem 'spring'
 gem 'sqlite3'
end

group :production do
    gem 'pg'
    gem 'rails_12factor'
end

group :doc do
    gem 'sdoc', '~> 0.4.0', require: false
end
EggSix
fonte
Você está implantando no Heroku?
Ahmad Al-kheat
Sim, já fiz isso e estou procurando nos logs do heroku e encontrei esse erro.
EggSix
3
é mais provável, porque você não inicializar as constantes da AWS em Heroku, você precisa executar $ heroku config: set S3_BUCKET_NAME = your_bucket_name $ heroku config: set AWS_ACCESS_KEY_ID = your_access_key_id $ heroku config: set AWS_SECRET_ACCESS_KEY = your_secret_access_key
Ahmad Al-kheat
hmmm Eu segui essa etapa, mas vou começar tudo de novo apenas para ter certeza de que está certo
EggSix
Ok, deixe-me saber se funciona para que eu possa torná-lo uma resposta para que outras pessoas também se beneficiem.
Ahmad Al-kheat

Respostas:

179

Modifique o aws-sdk do Gemfile para instalar uma versão anterior à 2.0:

gem 'aws-sdk', '< 2.0'

Este problema foi introduzido com a nova versão do aws-sdk (2.0+). Você pode ler mais aqui: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Topázio
fonte
2
Eu descobri que o motivo está na gem atualizada 'aws-sdk'. Há uma nova versão (2+) do aws-sdk que não é compatível com as versões anteriores. Você pode ler um pouco mais aqui:
TopaZ
Obrigado, exatamente o que eu precisava!
Sprachprofi de
27
Além disso, você pode substituir essa linha por gem 'aws-sdk-v1'. Isso permite que você instale a gem v2 aws-sdk. Eles podem ser usados ​​juntos no mesmo aplicativo devido aos diferentes namespaces.
Trevor Rowe
A solução de Trevor Rowe funcionou perfeitamente para mim - e o fato de que eles podem ser usados ​​simultaneamente é muito útil. Obrigado Trevor!
XtraSimplicity
18

Existe uma solução oficial. Use um clipe de papel deste ramo: funciona com as versões do aws-sdk acima de 2

gem 'paperclip', :git=> 'https://github.com/thoughtbot/paperclip', :ref => '523bd46c768226893f23889079a7aa9c73b57d68'

basta adicionar: parâmetro s3_region à configuração do clipe de papel s3

funciona para mim

Vitali Mogilevsky
fonte
1
Esta é a melhor resposta agora, já que o aws 1 está obsoleto.
ardochhigh
4

Comecei a trabalhar navegando até minha pasta de gemas e alterando as joias para:

  • gema 'clipe de papel'
  • gem 'aws-sdk'

As declarações de versão podem ser eliminadas.

Para evitar obter um gem.lock error, execute em bundle updatevez de bundle install, caso contrário, apenas as gemas serão atualizadas.

Agora, o heroku logs -tcomando pode ser usado para monitorar o servidor heroku para uploads de imagens.

Originalmente, recebi um novo erro, Access Denied Errorpara o servidor AWS.

Para corrigir isso, encontrei o Active Access Key IDcom a data mais recente no site da Amazon e usei os comandos do heroku para inserir a última Access key IDe Secret access key.

Isso me permitiu ver minha imagem no heroku.

Já tinha feito tantos Access key IDe Secret access keystentando consertar o problema, mas descobri que as joias eram o verdadeiro problema.

Dica: salve todas as informações da sua chave de acesso no OneNote, Bloco de notas, etc. Dessa forma, você pode retornar e verificá-las.

RichiRich
fonte
Estou tendo o mesmo problema, você resolveu removendo as versões?
Spartacus38
3

Clip de papel usado para usar AWS-SDK v1 nas versões 4.3 e abaixo. Eles estão tentando incluir o AWS-SDK v2

documento oficial de atualização https://github.com/thoughtbot/paperclip/blob/master/UPGRADING

##################################################
#  NOTE FOR UPGRADING FROM 4.3.0 OR EARLIER       #
##################################################

Paperclip is now compatible with aws-sdk >= 2.0.0.

If you are using S3 storage, aws-sdk >= 2.0.0 requires you to make a few small
changes:

* You must set the `s3_region`
* If you are explicitly setting permissions anywhere, such as in an initializer,
  note that the format of the permissions changed from using an underscore to
  using a hyphen. For example, `:public_read` needs to be changed to
  `public-read`.

devido a alguma incomparabilidade com versões anteriores (leia este https://github.com/thoughtbot/paperclip/issues/2021 ) isso foi mesclado, mas oficialmente ainda não foi lançado, mas deve ser lançado em Paperclip v5.0.0

Então, como Vitali Mogilevsky mencionou, você tem que usar isso agora:

# Gemfile
# ...
gem 'paperclip', :git=> 'https://github.com/thoughtbot/paperclip', :ref => '523bd46c768226893f23889079a7aa9c73b57d68'

Quando Paperclip 5.0 for lançado, AWS-SDK v2 deve ser incluído

equivalente8
fonte