NameError (niezainicjalizowany stały Paperclip :: Storage :: S3 :: AWS):

91

Próbuję włączyć obrazy do mojej aplikacji internetowej i po usunięciu kilku funkcji nadal pojawia się ten błąd. Sprowadziłem się do mojego kontrolera „tworzenia” aplikacji i nie jestem do końca pewien, dokąd mam się udać.

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

Artykuły_kontroler.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
źródło
Czy wdrażasz w Heroku?
Ahmad Al-kheat
Tak, już mam i szukam w logach heroku i znalazłem ten błąd.
EggSix
3
to jest najbardziej prawdopodobne, ponieważ nie zainicjować AWS stałe w Heroku, trzeba uruchomić $ Heroku Config: ustawianie S3_BUCKET_NAME = your_bucket_name $ Heroku Config: ustawianie AWS_ACCESS_KEY_ID = your_access_key_id $ Heroku config: zestaw AWS_SECRET_ACCESS_KEY = your_secret_access_key
Ahmad Al-kheat
hmmm zrobiłem ten krok, ale zacznę od początku, aby upewnić się, że wszystko jest w porządku
EggSix,
Ok, daj mi znać, czy to działa, abym mógł uczynić z tego odpowiedź dla innych osób.
Ahmad Al-kheat

Odpowiedzi:

179

Zmodyfikuj aws-sdk w pliku Gemfile, aby zainstalować wersję wcześniejszą niż 2.0:

gem 'aws-sdk', '< 2.0'

Ten problem został wprowadzony w nowej wersji aws-sdk (2.0+). Możesz przeczytać więcej tutaj: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Topaz
źródło
2
Odkryłem, że powodem jest zaktualizowany klejnot „aws-sdk”. Dostępna jest nowa wersja (2+) aws-sdk, która nie jest wstecznie kompatybilna z poprzednimi wersjami. Możesz przeczytać nieco więcej tutaj:
TopaZ
Dziękuję, dokładnie to, czego potrzebowałem!
Sprachprofi
27
Możesz również zamienić tę linię na gem 'aws-sdk-v1'. Pozwala to na pobranie klejnotu aws-sdk v2. Mogą być używane razem w tej samej aplikacji ze względu na różne przestrzenie nazw.
Trevor Rowe
Rozwiązanie Trevora Rowe'a sprawdziło się dla mnie idealnie - a fakt, że można ich używać jednocześnie, jest bardzo przydatny. Dzięki Trevor!
XtraSimplicity
18

Istnieje oficjalne rozwiązanie Użyj spinacza z tej gałęzi: działa z wersjami aws-sdk powyżej 2

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

po prostu dodaj parametr: s3_region do konfiguracji spinacza s3

pracuje dla mnie

Vitali Mogilevsky
źródło
1
To jest teraz najlepsza odpowiedź, ponieważ aws 1 jest przestarzały.
ardochhigh
4

Uruchomiłem go, przechodząc do mojego folderu klejnotów i zmieniając klejnoty na:

  • klejnot „spinacz do papieru”
  • klejnot „aws-sdk”

Deklaracje wersji można usunąć.

Aby uniknąć otrzymania gem.lock error, biegnij bundle updatezamiast bundle install, w przeciwnym razie tylko klejnoty zostaną zaktualizowane.

Teraz heroku logs -tmożna użyć polecenia do monitorowania serwera heroku pod kątem przesyłania obrazów.

Pierwotnie otrzymałem nowy błąd Access Denied Errordla serwera AWS.

Aby to naprawić, znalazłem Active Access Key IDna stronie Amazon najnowszą datę i użyłem poleceń heroku, aby wprowadzić najnowsze Access key IDi Secret access key.

Umożliwiło mi to wyświetlenie mojego obrazu na heroku.

Zrobiłem tak wiele Access key IDi Secret access keyspróbowałem rozwiązać problem, ale odkryłem, że klejnoty są prawdziwym problemem.

Porada: Zapisz wszystkie informacje o kluczu dostępu w programie OneNote, Notatniku itp. W ten sposób możesz je zwrócić i sprawdzić.

RichiRich
źródło
Mam ten sam problem, czy rozwiązałeś go, usuwając wersje?
Gary Wallen
3

Spinacz do użycia z AWS-SDK v1 w wersji 4.3 i poniżej. Próbują dołączyć AWS-SDK v2

oficjalny dokument aktualizacji 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`.

ze względu na pewną nieporównywalność wsteczną (przeczytaj to https://github.com/thoughtbot/paperclip/issues/2021 ) jest to scalone, ale oficjalnie jeszcze nie wydane, ale powinno zostać wydane w Paperclip v5.0.0

Więc jak wspomniał Vitali Mogilevsky , na razie musisz tego użyć:

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

Po wydaniu Paperclip 5.0, powinien być dołączony AWS-SDK v2

odpowiednik 8
źródło