NameError (Paperclip konstan yang tidak diinisialisasi :: Storage :: S3 :: AWS):

91

Saya mencoba memasukkan gambar ke dalam aplikasi web saya dan saya terus mengalami kesalahan ini setelah menghapus beberapa fitur. Itu datang ke pengontrol aplikasi 'buat' saya dan saya tidak sepenuhnya yakin ke mana saya harus pergi dari sini.

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
sumber
Apakah Anda menerapkan ke Heroku?
Ahmad Al-kheat
Ya, saya sudah punya dan saya mencari di log heroku dan menemukan kesalahan itu.
EggSix
3
kemungkinan besar karena Anda tidak menginisialisasi AWS konstanta di Heroku, Anda perlu menjalankan $ 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 saya memang mengikuti langkah itu tapi saya akan mulai dari awal hanya untuk memastikan itu benar
EggSix
Oke beri tahu saya jika berhasil sehingga saya bisa menjadikannya sebagai jawaban untuk orang lain agar mendapat manfaat juga.
Ahmad Al-kheat

Jawaban:

179

Ubah aws-sdk Gemfile Anda untuk menginstal versi sebelum 2.0:

gem 'aws-sdk', '< 2.0'

Masalah ini diperkenalkan dengan versi baru aws-sdk (2.0+). Anda dapat membaca lebih lanjut di sini: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Batu topas
sumber
2
Saya telah menemukan bahwa alasannya ada di permata 'aws-sdk' yang diperbarui. Ada versi baru (2+) dari aws-sdk yang tidak kompatibel dengan versi sebelumnya. Anda dapat membaca lebih banyak di sini:
TopaZ
Terima kasih, apa yang saya butuhkan!
Sprachprofi
27
Juga, Anda dapat mengganti baris itu dengan gem 'aws-sdk-v1'. Ini kemudian memungkinkan Anda untuk menarik permata v2 aws-sdk. Mereka dapat digunakan bersama dalam aplikasi yang sama karena ruang nama yang berbeda.
Trevor Rowe
Solusi Trevor Rowe bekerja dengan sempurna untuk saya - dan fakta bahwa solusi tersebut dapat digunakan secara bersamaan sangatlah berguna. Terima kasih Trevor!
XtraSimplicity
18

Ada solusi resmi Gunakan penjepit kertas dari cabang ini: ini berfungsi dengan versi aws-sdk di atas 2

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

cukup tambahkan: parameter s3_region ke konfigurasi paperclip s3 Anda

bekerja untuk saya

Vitali Mogilevsky
sumber
1
Ini adalah jawaban terbaik sekarang, karena aws 1 sudah tidak digunakan lagi.
Ardochhigh
4

Saya membuatnya berfungsi dengan menavigasi ke folder permata saya dan mengubah Permata menjadi:

  • permata 'penjepit kertas'
  • permata 'aws-sdk'

Deklarasi versi dapat dihapus.

Untuk menghindari mendapatkan gem.lock error, menjalankan bundle updatebukannya bundle install, jika tidak hanya permata akan diperbarui.

Sekarang, heroku logs -tperintah tersebut dapat digunakan untuk memantau server heroku untuk mengunggah gambar.

Saya awalnya menerima kesalahan baru, Access Denied Erroruntuk server AWS.

Untuk memperbaikinya saya menemukan Active Access Key IDdengan tanggal terbaru di situs web Amazon dan menggunakan perintah heroku untuk memasukkan yang terbaru Access key IDdan Secret access key.

Ini memungkinkan saya untuk melihat gambar saya di heroku.

Saya telah membuat begitu banyak Access key IDdan Secret access keysmencoba untuk memperbaiki masalah, tetapi menemukan Permata menjadi masalah yang sebenarnya.

Tip: Simpan semua informasi Access Key Anda ke OneNote, Notepad, dll. Dengan cara ini Anda dapat kembali dan memeriksanya.

RichiRich
sumber
Saya mengalami masalah yang sama, apakah Anda menyelesaikannya dengan menghapus versi?
Gary Wallen
3

Paperclip digunakan untuk menggunakan AWS-SDK v1 di versi 4.3 dan yang lebih lama. Mereka mencoba memasukkan AWS-SDK v2

dokumen peningkatan resmi 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`.

karena beberapa kemunduran yang tidak dapat dibandingkan (baca https://github.com/thoughtbot/paperclip/issues/2021 ini ) ini digabungkan tetapi secara resmi belum dirilis, tetapi harus dirilis di Paperclip v5.0.0

Jadi seperti yang disebutkan Vitali Mogilevsky , Anda harus menggunakan ini sekarang:

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

Saat Paperclip 5.0 dirilis, AWS-SDK v2 harus disertakan

setara8
sumber