NameError (неинициализированная константа Paperclip :: Storage :: S3 :: AWS):

91

Я пытаюсь включить изображения в свое веб-приложение, и после удаления некоторых функций продолжаю сталкиваться с этой ошибкой. Все сводилось к моему «созданию» контроллера приложения, и я не совсем уверен, что мне делать дальше.

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
Яйцо Шесть
источник
Вы собираетесь использовать Heroku?
Ахмад Аль-Хеат
Да, у меня уже есть, и я просматриваю журналы heroku и обнаружил эту ошибку.
EggSix
3
это скорее всего потому , что вы не инициализировать AWS константы в Heroku, вам нужно запустить $ Heroku конфигурации: набор S3_BUCKET_NAME = your_bucket_name $ Heroku конфигурации: набор AWS_ACCESS_KEY_ID = your_access_key_id $ Heroku конфигурации: набор AWS_SECRET_ACCESS_KEY = your_secret_access_key
Ahmad Al-kheat
хммм, я выполнил этот шаг, но я начну все сначала, чтобы убедиться, что это правильно
EggSix
Хорошо, дайте мне знать, работает ли это, чтобы я мог сделать это ответом для других людей.
Ахмад Аль-Хеат

Ответы:

179

Измените aws-sdk вашего Gemfile, чтобы установить версию до 2.0:

gem 'aws-sdk', '< 2.0'

Эта проблема возникла в новой версии aws-sdk (2.0+). Подробнее читайте здесь: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Топаз
источник
2
Я обнаружил, что причина кроется в обновленном геме aws-sdk. Есть новая версия (2+) aws-sdk, которая не имеет обратной совместимости с предыдущими версиями. Вы можете прочитать немного больше здесь:
TopaZ
Спасибо, именно то, что мне было нужно!
Sprachprofi
27
Кроме того, вы можете заменить эту строку на gem 'aws-sdk-v1'. Затем это позволяет вам использовать гем v2 aws-sdk. Их можно использовать вместе в одном приложении из-за разных пространств имен.
Тревор Роу,
Решение Тревора Роу отлично сработало для меня - и тот факт, что их можно использовать одновременно, очень полезен. Спасибо, Тревор!
XtraSimplicity 04
18

Есть официальное решение Используйте скрепку из этой ветки: она работает с версиями aws-sdk выше 2

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

просто добавьте: параметр s3_region в конфигурацию s3 скрепки

работает для меня

Виталий Могилевский
источник
1
Это лучший ответ на данный момент, поскольку aws 1 устарел.
ardochhigh
4

Я заставил его работать, перейдя в папку с драгоценными камнями и изменив драгоценные камни на:

  • драгоценный камень 'скрепка'
  • драгоценный камень 'aws-sdk'

Объявления версии можно отбросить.

Чтобы избежать появления gem.lock error, запустите bundle updateвместо bundle install, иначе будут обновлены только драгоценные камни.

Теперь эту heroku logs -tкоманду можно использовать для отслеживания загрузки изображений на сервере heroku.

Я изначально получил новую ошибку Access Denied Errorдля сервера AWS.

Чтобы исправить это, я нашел Active Access Key IDпоследнюю дату на веб-сайте Amazon и использовал команды heroku для ввода последних Access key IDи Secret access key.

Это позволило мне просмотреть свое изображение на Heroku.

Я сделал так много Access key IDи Secret access keysпытался решить проблему, но обнаружил, что настоящая проблема - драгоценные камни.

Совет. Сохраните всю информацию о ключе доступа в OneNote, Блокноте и т. Д. Таким образом вы можете вернуться и проверить их.

RichiRich
источник
У меня та же проблема, вы решили ее, удалив версии?
Гэри Уоллен
3

Скрепка используется для использования AWS-SDK v1 в версиях 4.3 и ниже. Они пытаются включить AWS-SDK v2

официальный документ об обновлении https://github.com/gotitbot/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`.

из-за некоторой обратной несовместимости (прочтите этот https://github.com/oughttbot/paperclip/issues/2021 ), это объединено, но официально еще не выпущено, но должно быть выпущено в Paperclip v5.0.0

Итак, как упомянул Виталий Могилевский , вы должны использовать это сейчас:

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

При выпуске Paperclip 5.0 должен быть включен AWS-SDK v2.

эквивалент8
источник