NameError (constante no inicializada Paperclip :: Storage :: S3 :: AWS):

91

Estoy tratando de incorporar imágenes en mi aplicación web y sigo encontrando este error después de eliminar algunas funciones. Todo se redujo a mi controlador de aplicación 'crear' y no estoy del todo seguro de a dónde debo ir desde aquí.

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
fuente
¿Está desplegando en Heroku?
Ahmad Al-kheat
Sí, ya lo hice y estoy buscando en los registros de heroku y encontré ese error.
EggSix
3
lo más probable debido a que no inicializar las constantes de AWS en Heroku, es necesario ejecutar $ heroku config: Conjunto S3_BUCKET_NAME = your_bucket_name $ heroku config: Conjunto AWS_ACCESS_KEY_ID = your_access_key_id $ heroku config: Conjunto AWS_SECRET_ACCESS_KEY = your_secret_access_key
Ahmad Al-kheat
hmmm, seguí ese paso, pero comenzaré de nuevo solo para asegurarme de que sea correcto
EggSix
Ok, avíseme si funciona para que pueda convertirlo en una respuesta para que otras personas también se beneficien.
Ahmad Al-kheat

Respuestas:

179

Modifique el aws-sdk de su Gemfile para instalar una versión anterior a la 2.0:

gem 'aws-sdk', '< 2.0'

Este problema se introdujo con la nueva versión de aws-sdk (2.0+). Puede leer más aquí: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Topacio
fuente
2
Descubrí que el motivo está en la gema 'aws-sdk' actualizada. Hay una nueva versión (2+) de aws-sdk que no es compatible con versiones anteriores. Puedes leer un poco más aquí:
TopaZ
¡Gracias, exactamente lo que necesitaba!
Sprachprofi
27
Además, puede reemplazar esa línea con gem 'aws-sdk-v1'. Esto le permite extraer la gema v2 aws-sdk. Se pueden usar juntos en la misma aplicación debido a los diferentes espacios de nombres.
Trevor Rowe
La solución de Trevor Rowe funcionó perfectamente para mí, y el hecho de que se puedan usar simultáneamente es muy útil. ¡Gracias Trevor!
XtraSimplicity
18

Hay una solución oficial.Use un clip de esta rama: funciona con versiones aws-sdk anteriores a 2

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

simplemente agregue: parámetro s3_region a su configuración s3 del clip

funciona para mi

Vitali Mogilevsky
fuente
1
Esta es la mejor respuesta ahora, ya que aws 1 está en desuso.
ardochhigh
4

Lo hice funcionar navegando a mi carpeta de gemas y cambiando las gemas a:

  • joya 'clip'
  • joya 'aws-sdk'

Las declaraciones de versión se pueden eliminar.

Para evitar obtener un gem.lock error, ejecute en bundle updatelugar de bundle install, de lo contrario, solo se actualizarán las gemas.

Ahora, el heroku logs -tcomando se puede usar para monitorear el servidor heroku para cargar imágenes.

Originalmente recibí un nuevo error Access Denied Errorpara el servidor de AWS.

Para solucionar esto, encontré la Active Access Key IDúltima fecha en el sitio web de Amazon y usé los comandos heroku para ingresar la última Access key IDy Secret access key.

Esto me permitió ver mi imagen en heroku.

Había hecho muchos Access key IDy Secret access keystratando de solucionar el problema, pero descubrí que las gemas eran el verdadero problema.

Sugerencia: Guarde toda la información de su clave de acceso en OneNote, Bloc de notas, etc. De esta manera puede regresar y verificarla.

RichiRich
fuente
Me encuentro con el mismo problema, ¿lo resolvió eliminando las versiones?
Spartacus38
3

Paperclip se utiliza para utilizar AWS-SDK v1 en las versiones 4.3 y siguientes. Están intentando incluir AWS-SDK v2

documento de actualización oficial 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`.

debido a cierta incomparabilidad hacia atrás (lea esto https://github.com/thoughtbot/paperclip/issues/2021 ) esto se fusionó pero aún no se lanzó oficialmente, pero debería publicarse en Paperclip v5.0.0

Entonces, como mencionó Vitali Mogilevsky , debes usar esto por ahora:

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

Cuando se lance Paperclip 5.0, se debe incluir AWS-SDK v2

equivalente8
fuente