NameError (constante non initialisée Paperclip :: Storage :: S3 :: AWS):

91

J'essaie d'incorporer des images dans mon application Web et je continue de rencontrer cette erreur après avoir supprimé de nombreuses fonctionnalités. Cela revenait à mon contrôleur d'application «créer» et je ne suis pas tout à fait sûr de savoir où je devrais aller à partir d'ici.

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
la source
Vous déployez sur Heroku?
Ahmad Al-kheat
Oui, je l'ai déjà et je regarde dans les journaux heroku et j'ai trouvé cette erreur.
EggSix
3
il est plus probable parce que vous ne l' avez pas initialisez les constantes de AWS dans Heroku, vous devez exécuter $ 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 j'ai suivi cette étape mais je vais tout recommencer juste pour m'assurer que c'est vrai
EggSix
Ok, laissez-moi savoir si cela fonctionne afin que je puisse en faire une réponse pour que d'autres personnes en bénéficient également.
Ahmad Al-kheat

Réponses:

179

Modifiez aws-sdk de votre Gemfile pour installer une version antérieure à 2.0:

gem 'aws-sdk', '< 2.0'

Ce problème a été introduit avec la nouvelle version d'aws-sdk (2.0+). Vous pouvez en savoir plus ici: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Topaze
la source
2
J'ai trouvé que la raison est dans la gemme 'aws-sdk' mise à jour. Il existe une nouvelle version (2+) de aws-sdk qui n'est pas rétrocompatible avec les versions précédentes. Vous pouvez en lire un peu plus ici:
TopaZ
Merci, exactement ce dont j'avais besoin!
Sprachprofi
27
En outre, vous pouvez remplacer cette ligne par gem 'aws-sdk-v1'. Cela vous permet ensuite d'extraire le gem v2 aws-sdk. Ils peuvent être utilisés ensemble dans la même application en raison des différents espaces de noms.
Trevor Rowe
La solution de Trevor Rowe a parfaitement fonctionné pour moi - et le fait qu'ils puissent être utilisés simultanément est très utile. Merci Trevor!
XtraSimplicity
18

Il existe une solution officielle Utilisez un trombone de cette branche: cela fonctionne avec les versions aws-sdk supérieures à 2

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

ajoutez simplement: le paramètre s3_region à votre configuration s3 paperclip

travaille pour moi

Vitali Mogilevsky
la source
1
C'est la meilleure réponse maintenant, car aws 1 est obsolète.
ardochhigh
4

Je l'ai fait fonctionner en accédant à mon dossier de gemmes et en changeant les gemmes en:

  • bijou 'trombone'
  • gem 'aws-sdk'

Les déclarations de version peuvent être supprimées.

Pour éviter d'avoir un gem.lock error, exécutez bundle updateau lieu debundle install , sinon seules les gemmes seront mises à jour.

Maintenant, la heroku logs -tcommande peut être utilisée pour surveiller le serveur heroku pour les téléchargements d'images.

J'ai initialement reçu une nouvelle erreur, Access Denied Errorpour le serveur AWS.

Pour résoudre ce problème, j'ai trouvé le Active Access Key IDavec la dernière date sur le site Web d'Amazon et utilisé les commandes heroku pour saisir le dernier Access key IDet Secret access key.

Cela m'a permis de voir mon image sur heroku.

J'en avais fait tellement Access key IDet en Secret access keysessayant de résoudre le problème, mais j'ai trouvé que les gemmes étaient le vrai problème.

Conseil: enregistrez toutes vos informations de clé d'accès dans OneNote, le bloc-notes, etc. De cette façon, vous pouvez les retourner et les vérifier.

RichiRich
la source
Je rencontre le même problème, l'avez-vous résolu en supprimant les versions?
Spartacus38
3

Paperclip utilise pour utiliser AWS-SDK v1 dans les versions 4.3 et ci-dessous. Ils essaient d'inclure l'AWS-SDK v2

document officiel de mise à niveau 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`.

en raison d'une incomparabilité à l'envers (lisez ceci https://github.com/thoughtbot/paperclip/issues/2021 ), il est fusionné mais officiellement pas encore publié, mais devrait être publié dans Paperclip v5.0.0

Donc, comme Vitali Mogilevsky l'a mentionné, vous devez utiliser ceci pour l'instant:

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

Lors de la sortie de Paperclip 5.0, AWS-SDK v2 doit être inclus

équivalent8
la source