NameError (nicht initialisierte Konstante Paperclip :: Storage :: S3 :: AWS):

91

Ich versuche, Bilder in meine Web-App zu integrieren, und es tritt immer wieder dieser Fehler auf, nachdem ich einige Funktionen entfernt habe. Es kam auf meinen 'create' Anwendungscontroller an und ich bin mir nicht ganz sicher, wohin ich von hier aus gehen soll.

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
quelle
Stellen Sie Heroku bereit?
Ahmad Al-Kheat
Ja, ich habe bereits und ich schaue in den Heroku-Protokollen und habe diesen Fehler gefunden.
EggSix
3
es ist sehr wahrscheinlich , weil Sie nicht die AWS Konstanten in Heroku initialisiert haben, müssen Sie $ Heroku Config laufen: 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 ich habe diesen Schritt befolgt, aber ich werde von vorne anfangen, nur um sicherzugehen, dass es richtig ist
EggSix
Ok, lassen Sie mich wissen, ob es funktioniert, damit ich es auch anderen Menschen als Antwort geben kann.
Ahmad Al-Kheat

Antworten:

179

Ändern Sie das aws-sdk Ihrer Gemfile, um eine Version vor 2.0 zu installieren:

gem 'aws-sdk', '< 2.0'

Dieses Problem wurde mit der neuen Version von aws-sdk (2.0+) eingeführt. Weitere Informationen finden Sie hier: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Topas
quelle
2
Ich habe festgestellt, dass der Grund im aktualisierten Juwel 'aws-sdk' liegt. Es gibt eine neue Version (2+) von aws-sdk, die nicht abwärtskompatibel mit früheren Versionen ist. Sie können ein bisschen mehr hier
TopaZ
Danke, genau das, was ich brauchte!
Sprachprofi
27
Sie können diese Zeile auch durch ersetzen gem 'aws-sdk-v1'. Auf diese Weise können Sie den v2 aws-sdk-Edelstein ziehen. Sie können aufgrund der unterschiedlichen Namespaces zusammen in derselben Anwendung verwendet werden.
Trevor Rowe
Die Lösung von Trevor Rowe hat für mich perfekt funktioniert - und die Tatsache, dass sie gleichzeitig verwendet werden können, ist sehr nützlich. Danke Trevor!
XtraSimplicity
18

Es gibt eine offizielle Lösung. Verwenden Sie eine Büroklammer aus diesem Zweig: Sie funktioniert mit aws-sdk-Versionen über 2

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

Fügen Sie einfach den Parameter s3_region zu Ihrer Büroklammer s3-Konfiguration hinzu

funktioniert bei mir

Vitali Mogilevsky
quelle
1
Dies ist jetzt die beste Antwort, da aws 1 veraltet ist.
Ardochhigh
4

Ich habe es zum Laufen gebracht, indem ich zu meinem Edelsteinordner navigiert und die Edelsteine ​​geändert habe in:

  • Edelstein 'Büroklammer'
  • Edelstein 'aws-sdk'

Die Versionsdeklarationen können gelöscht werden.

Um ein zu vermeiden gem.lock error, führen Sie bundle updatestatt aus bundle install, da sonst nur die Edelsteine ​​aktualisiert werden.

Jetzt kann der heroku logs -tBefehl verwendet werden, um den Heroku-Server auf Bild-Uploads zu überwachen.

Ich habe ursprünglich einen neuen Fehler Access Denied Errorfür den AWS-Server erhalten.

Um dies zu beheben, fand ich die Active Access Key IDmit dem neuesten Datum auf der Amazon-Website und verwendete Heroku-Befehle, um die neuesten Access key IDund einzugeben Secret access key.

Dadurch konnte ich mein Bild auf Heroku anzeigen.

Ich hatte so viele gemacht Access key IDund Secret access keysversucht, das Problem zu beheben, fand aber, dass die Edelsteine ​​das eigentliche Problem waren.

Tipp: Speichern Sie alle Ihre Zugangsschlüsselinformationen in OneNote, Notepad usw. Auf diese Weise können Sie sie zurückgeben und überprüfen.

RichiRich
quelle
Ich habe das gleiche Problem. Haben Sie es behoben, indem Sie die Versionen entfernt haben?
Spartacus38
3

Büroklammer zur Verwendung von AWS-SDK v1 in Version 4.3 und unten. Sie versuchen, das AWS-SDK v2 einzuschließen

offizielles Upgrade-Dokument 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`.

Aufgrund einiger Rückwärtsvergleichbarkeit (lesen Sie diese https://github.com/thoughtbot/paperclip/issues/2021 ) wird diese zusammengeführt, aber offiziell noch nicht veröffentlicht, sollte aber in Paperclip v veröffentlicht werden5.0.0

Wie Vitali Mogilevsky bereits erwähnt hat, müssen Sie dies vorerst verwenden:

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

Wenn Paperclip 5.0 veröffentlicht wird, sollte AWS-SDK v2 enthalten sein

Äquivalent8
quelle