NameError (uninitialized constant Paperclip::Storage::S3::AWS):
Asked Answered
S

4

91

I'm trying to incorporate images into my web app and I keep running into this error after removing quite a few features. It came down to my 'create' application controller and I'm not entirely sure where I should go from here.

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
Schwab answered 6/2, 2015 at 20:38 Comment(6)
Are you deploying to Heroku?Arthritis
Yes, I already have and I'm looking in the heroku logs and found that error.Schwab
it's most likely because you didn't initialize the AWS constants in Heroku, you need to run $ 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_keyArthritis
hmmm I did follow that step but I'll start all over just to make sure it's rightSchwab
Ok let me know if it works so that I can make it an answer for other people to benefit as well.Arthritis
I'm still receiving the same errors as before.Schwab
M
179

Modify your Gemfile's aws-sdk to install a version prior to 2.0:

gem 'aws-sdk', '< 2.0'

This issue was introduced with new version of aws-sdk (2.0+). You can read more here: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Marriageable answered 6/2, 2015 at 23:39 Comment(3)
I've found that the reason is in updated 'aws-sdk' gem. There is a new version (2+) of aws-sdk that is not backward compatible with previous versions. You can read a bit more here:Marriageable
Also, you can replace that line with gem 'aws-sdk-v1'. This then allows you to pull in the v2 aws-sdk gem. They can be used together in the same application because of the different namespaces.Bounded
Trevor Rowe's solution worked perfectly for me -- and the fact that they can be used simultaneously is very useful. Thanks Trevor!Pent
C
18

There is official solution Use paperclip from this branch: it works with aws-sdk versions above 2

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

just add :s3_region parameter to your paperclip s3 config

works for me

Cholecyst answered 21/10, 2015 at 14:47 Comment(1)
This is the best answer now, as aws 1 is deprecated.Rawinsonde
O
4

I got it to work by navigating to my gem folder and changing the Gems to:

  • gem ‘paperclip’
  • gem ‘aws-sdk’

The version declarations can be dropped.

To avoid getting a gem.lock error, run bundle update instead of bundle install, otherwise only the gems will be updated.

Now, the heroku logs -t command can be used to monitor the heroku server to image uploads.

I orginally received a new error, Access Denied Error for AWS server.

To fix this I found the Active Access Key ID with the latest date on the Amazon websiteand used heroku commands to input the latest Access key ID and Secret access key.

This enabled me to view my image on heroku.

I had made so many Access key ID and Secret access keys trying to fix the problem, but found the Gems to be the real problem.

Tip: Save all your Access Key info to OneNote, Notepad, etc. This way you can return and check them.

Oke answered 3/7, 2015 at 16:16 Comment(1)
I'm running into the same issue, did you resolve it by removing the versions?Showboat
D
3

Paperclip use to use AWS-SDK v1 in versions 4.3 and bellow. They are trying to include the AWS-SDK v2

official upgrade document 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`.

due to some backwards incomparability (read this https://github.com/thoughtbot/paperclip/issues/2021) this is merged but officially not released yet, but should be released in Paperclip v 5.0.0

So like Vitali Mogilevsky mentioned, you have to use this for now:

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

When Paperclip 5.0 is released, AWS-SDK v2 should be included

Denotative answered 21/3, 2016 at 11:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.