NameError (costante Paperclip :: Storage :: S3 :: AWS non inizializzata):


91

Sto cercando di incorporare immagini nella mia app Web e continuo a riscontrare questo errore dopo aver rimosso alcune funzionalità. È arrivato al mio controller dell'applicazione "crea" e non sono del tutto sicuro di dove dovrei andare da qui.

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

Stai distribuendo a Heroku?
Ahmad Al-kheat

Sì, l'ho già fatto e sto cercando nei log di heroku e ho trovato quell'errore.
EggSix

3
è più probabile perché non hai inizializzare le AWS costanti in Heroku, è necessario eseguire $ Heroku config: insieme S3_BUCKET_NAME = your_bucket_name $ Heroku config: insieme AWS_ACCESS_KEY_ID = your_access_key_id $ Heroku config: insieme AWS_SECRET_ACCESS_KEY = your_secret_access_key
Ahmad Al-kheat

hmmm Ho seguito quel passaggio ma ricomincerò tutto da capo solo per assicurarmi che sia giusto
EggSix

Ok fammi sapere se funziona in modo che possa renderlo una risposta anche per altre persone.
Ahmad Al-kheat

Risposte:


179

Modifica aws-sdk di Gemfile per installare una versione precedente alla 2.0:

gem 'aws-sdk', '< 2.0'

Questo problema è stato introdotto con la nuova versione di aws-sdk (2.0+). Puoi leggere di più qui: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2


2
Ho scoperto che il motivo è nella gemma "aws-sdk" aggiornata. Esiste una nuova versione (2+) di aws-sdk che non è compatibile con le versioni precedenti. Puoi leggere un po 'di più qui:
TopaZ

Grazie, esattamente quello di cui avevo bisogno!
Sprachprofi

27
Inoltre, puoi sostituire quella riga con gem 'aws-sdk-v1'. Questo ti consente quindi di inserire la gemma aws-sdk v2. Possono essere utilizzati insieme nella stessa applicazione a causa dei diversi spazi dei nomi.
Trevor Rowe

La soluzione di Trevor Rowe ha funzionato perfettamente per me e il fatto che possano essere utilizzati contemporaneamente è molto utile. Grazie Trevor!
XtraSimplicity

18

Esiste una soluzione ufficiale Usa paperclip da questo ramo: funziona con le versioni di aws-sdk sopra la 2

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

basta aggiungere: il parametro s3_region alla configurazione s3 della graffetta

per me va bene


1
Questa è la risposta migliore ora, poiché aws 1 è deprecato.
ardochhigh

4

L'ho fatto funzionare accedendo alla mia cartella gem e cambiando le gemme in:

  • gemma "graffetta"
  • gemma "aws-sdk"

Le dichiarazioni di versione possono essere eliminate.

Per evitare di ottenere un gem.lock error, corri bundle updateinvece dibundle install , altrimenti verranno aggiornate solo le gemme.

Ora, il heroku logs -tcomando può essere utilizzato per monitorare il server heroku per caricare le immagini.

Ho ricevuto originariamente un nuovo errore, Access Denied Errorper il server AWS.

Per risolvere questo problema, ho trovato la Active Access Key IDdata più recente sul sito Web di Amazon e ho utilizzato i comandi heroku per inserire l'ultima Access key IDe Secret access key.

Questo mi ha permesso di visualizzare la mia immagine su heroku.

Ne avevo fatti così tanti Access key IDe Secret access keyscercavo di risolvere il problema, ma trovavo che le gemme fossero il vero problema.

Suggerimento: salva tutte le informazioni sulla chiave di accesso su OneNote, Blocco note, ecc. In questo modo puoi tornare indietro e controllarle.


Sto riscontrando lo stesso problema, l'hai risolto rimuovendo le versioni?
Spartacus38

3

Paperclip utilizza per utilizzare AWS-SDK v1 nelle versioni 4.3 e successive. Stanno cercando di includere AWS-SDK v2

documento ufficiale di aggiornamento 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`.

a causa di alcune incomparabilità all'indietro (leggi questo https://github.com/ Thoughtbot/paperclip/issues/2021) questo è stato unito ma ufficialmente non ancora rilasciato, ma dovrebbe essere rilasciato in Paperclip v5.0.0

Quindi, come ha detto Vitali Mogilevsky , devi usare questo per ora:

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

Quando viene rilasciato Paperclip 5.0, dovrebbe essere incluso AWS-SDK v2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.